1. 程式人生 > >C# 多態(2)

C# 多態(2)

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)