C#中多重繼承

來源:互聯網
上載者:User

原文地址: http://blog.csdn.net/yarshray/article/details/14824

寫的挺不錯的,淺顯易懂。

 

其實想寫這篇文章,是因為突然在整理論壇上的文章的時候,突然發現一個人問我如何才能在C#中實現多重繼承,當時我答的很隱晦,因此這裡我想補充說明一下.

首先,我要說明一下,C#中是沒有類的多重繼承這個概念.要使用多重繼承必須要通過介面Interface來完成.可是大家都知道Interface實際上就是一個虛函數列表指標.內部封裝的只有函數和屬性.而且介面(Interface)不能實力化只能通過派生(因為沒有建構函式)才可以使用.這一點和抽象類別很類似,可是抽象類別是個類,他有方法的實現.它所描述的對象是一個無法在現實中具現的對象,但它本身是個類對象.而介面實際上是一種標準.說了這麼多,下面我來舉一個例子如何在C#中實現多重繼承.

myBase.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Intdv{    public abstract class myBase    {        public myBase()        {            //            // To do something here            //        }    }}

  myDerive1.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Intdv{    class myDerive1 : Intdv.myBase    {        string myName;        public myDerive1()        {            //            // To do something here            //            myName = "yarshary";        }        public void ShowMyName()        {            Console.WriteLine("my name is: " + this.myName);        }        public void reName(string n)        {            myName = n;        }       }    public interface ImyDerive1    {        void ShowMyName();        void reName(string n);    }}

  myDerive2.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Intdv{    public class myDerive2:Intdv.myBase    {        int MyAge;        public myDerive2()        {            //            // To do something here            //            MyAge = 21;        }        public void ShowMyAge()        {            Console.WriteLine("my age is:" + MyAge);        }        public void reAge(int a)        {            this.MyAge = a;        }    }    public interface ImyDerive2    {        void ShowMyAge();        void reAge(int a);    }}

  myMDerive.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Intdv{    public sealed class myMDerive:Intdv.myBase, Intdv.ImyDerive1, Intdv.ImyDerive2    {        Intdv.myDerive1 d1;        Intdv.myDerive2 d2;        public myMDerive()        {            //            // To do something here            //            d1 = new myDerive1();            d2 = new myDerive2();        }        public void ShowMyName()        {            d1.ShowMyName();        }        public void reName(string n)        {            d1.reName(n);        }        public void ShowMyAge()        {            d2.ShowMyAge();        }        public void reAge(int a)        {            d2.reAge(a);        }    }}

  

案例分析,首先我上在一開始定義了一個基類myBase,並派生出了兩個衍生類別分別為myDerive1,myDerive2
這兩個類分別定義了一組操作,myDerive1中定義了操作ShowMyName 和 reName 並通過接ImyDerive1加以
描述. myDerive2中定義了操作ShowMyAge 和 reAge 並通過介面ImyDerive2來描述,這樣我在多重繼承中
只用繼承介面也就是ImyDerive1和ImyDerive2就可以保證巨集指令清單的繼承,操作的實現通過組合模型.在
介面方法中體現.這裡還是從代碼來說明,我的派生對象myMDerive(M即多從繼承之意),雖然只繼承了介面,
可是在建構函式中,卻動態分配(New)了myDerive1 和 myDerive2 兩個對象.並在操作ShowMyName 等介面繼承來的操作中實際調用了myDerive1 和 myDerive2 的操作.由於myDerive1 和 myDerive2 是在
myMDerive內定義的,所以用戶端代碼(也就是我的主函數)並不需要管理對象的分配和釋放(當然在CLR託管
環境中對象的釋放一般也並非人為).

由以上例子,可以看出,實現借口留出函數介面具體實現通過組合的方式來實現多重繼承中方法體的實現.這樣既保證了單一繼承父類的唯一性,又保證了多重繼承的優點.我個人認為是個很不錯的設計方法,並且在我的程式設計中很多地方都採用了該方法.那麼好了,就到這裡了.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.