原文地址: 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託管
環境中對象的釋放一般也並非人為).
由以上例子,可以看出,實現借口留出函數介面具體實現通過組合的方式來實現多重繼承中方法體的實現.這樣既保證了單一繼承父類的唯一性,又保證了多重繼承的優點.我個人認為是個很不錯的設計方法,並且在我的程式設計中很多地方都採用了該方法.那麼好了,就到這裡了.