Re: [問題] 繼承與虛擬方法的問題

看板C_Sharp作者 (十三)時間15年前 (2010/11/24 12:04), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串3/3 (看更多)
※ 引述《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)

11/24 14:13, , 1F
受教了
11/24 14:13, 1F

11/24 18:01, , 2F
感謝 又學了一些 (抱歉 推文時間還沒過)
11/24 18:01, 2F

11/24 21:17, , 3F
原來是這樣 謝謝
11/24 21:17, 3F
※ 編輯: Deadshot465 來自: 140.119.156.239 (11/24 21:37)
文章代碼(AID): #1Cx8wq7h (C_Sharp)
文章代碼(AID): #1Cx8wq7h (C_Sharp)