C# 多態(2)

來源:互聯網
上載者:User

標籤:ati   base   消失   virtual   lin   key   方法   any   屬性   

接上面講

我們知道虛方法,和重寫方法。

但是有沒有發現 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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.