作者Deadshot465 (十三)
看板C_Sharp
標題Re: [問題] 繼承與虛擬方法的問題
時間Wed Nov 24 12:04:01 2010
※ 引述《ssccg (23)》之銘言:
: 你可以不要用virtual-override的方式
: Child類別裡用 new public int Data()
: Father類別的Data()就不會被改掉
: 而是在以Child類別的reference存取時會被隱藏
: 但用Father類別的reference呼叫或是在Father中呼叫都會取Father版的Data()
補充一下ssccg大這個部分
new跟override最明顯的一個差異在
假設將Father類別改寫成這樣:
class Father
{
public virtual int Data() { return 10; }
//新增一個virtual方法
public virtual string Name() { return "I'm father."; }
}
並把Child類別改寫成這樣:
class Child : Father
{
//Data方法使用Override
public override int Data() { return 200; }
//Name方法使用New
public new string Name() { return "I'm child."; }
}
則在Main()當中撰寫以下程式碼:
Father father = new Father();
Console.WriteLine(father.Data()); //如ssccg大說的,會印出10
Console.WriteLine(father.Name()); //I'm father.
Child child = new Child();
Console.WriteLine(child.Data()); //Data()方法已被override,印出200
//即使upcast成Father,仍會印出200,這是override的效果
Console.WriteLine(((Father)child).Data()); //200
Console.WriteLine(child.Name()); //I'm child.
//因為使用new只是隱藏了父類別的方法,所以當upcast成Father時,
//會使用Father的方法
Console.WriteLine(((Father)child).Name()); //I'm father.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.119.156.239
※ 編輯: Deadshot465 來自: 140.119.156.239 (11/24 12:04)
→ ashram:受教了 11/24 14:13
→ AJE:感謝 又學了一些 (抱歉 推文時間還沒過) 11/24 18:01
推 popmentos:原來是這樣 謝謝 11/24 21:17
※ 編輯: Deadshot465 來自: 140.119.156.239 (11/24 21:37)