C# 多態(2)
阿新 • • 發佈:2018-06-23
inf string spa 但是 RR 技術分享 參考 而且 read
接上面講
我們知道虛方法,和重寫方法。
但是有沒有發現 override和new的作用是差不多的。
但為什麽還要單獨寫出來兩個呢?
首先,咱們要明白一個問題,繼承是具有線性傳播的。
class Father { public int Money => 500; public void Comany() => Console.WriteLine("公司年年都賺錢!!!!"); } class Son : Father { public Son() => Console.WriteLine($"我繼承了我爸的{Money}"); public new void Comany() => Console.WriteLine("我不喜歡這個公司"); }
代碼中,Son具有Father的方法,屬性。換句話 Son使用的Father的方法。在Son的這個繼承鏈上,使用new來隱藏Father的成員/方法。 但也僅僅是隱藏。 並不代表不存在。
來看實例代碼:
new Son().Comany();//實例化 Son 並使用方法 Father father = new Son();//父類通過子類實例化 father.Comany();//父類實現方法 Son son = new Son();//實例化子類 (son as Father).Comany();//強轉父類,並實現方法
結果
話句話說,new關鍵字僅僅是在子類中的方法隱藏,就是單純的 我不想在子類中使用使用父類的方法。 但是不代表父類的方法就消失了。 子類依舊是有辦法能夠使用父類的方法
最簡單的證明就是在使用new關鍵字,在方法內使用base來實現父類的方法。 依舊是管用。
代碼:
....省略
class Son : Father { public Son() => Console.WriteLine($"我繼承了我爸的{Money}和公司"); public new void Comany() => base.Comany(); } static void Main(string[] args) { new Son().Comany();//實例化 Son 並使用方法 Father father = new Son();//父類通過子類實例化 father.Comany();//父類實現方法 Son son = new Son();//實例化子類 (son as Father).Comany();//強轉父類,並實現方法 }
那麽 override呢?
現階段能夠使用的override就只能配合virtual關鍵字。 那麽override是怎麽回事呢?
相對new,override是徹底的覆寫。包父類的方法。
看代碼:
class Program { static void Main(string[] args) { new Son().Comany();//實例化 Son 並使用方法 Father father = new Son();//父類通過子類實例化 father.Comany();//父類實現方法 Son son = new Son();//實例化子類 (son as Father).Comany();//強轉父類,並實現方法 ReadKey(); } } class Father { public int Money => 500; public virtual void Comany() => Console.WriteLine("公司年年都賺錢!!!!"); } class Son : Father { public Son() => Console.WriteLine($"我繼承了我爸的{Money}和公司"); public override void Comany() => Console.WriteLine("我不喜歡這個公司"); }
結果:
看見沒,連父類的方法都給你整沒了。只要你不是單純的使用父類,如果是通過子類來實現父類的方法而且還是override那基本就是不可能的事情了。
override就是在繼承鏈上徹底抹殺virtual的方法的存在。
如果virtual和new進行搭配呢?直接參考第一種方式。
C# 多態(2)