看板 C_Sharp 關於我們 聯絡資訊
※ 引述《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)