其实想写这篇文章,是因为突然在整理论坛上的帖子的时候,突然发现一个人问我如何才能在C#中实现多重继承,当时我答的很隐晦,因此这里我想补充说明一下.
首先,我要说明一下,C#中是没有类的多重继承这个概念.要使用多重继承必须要通过接口Interface来完成.可是大家都知道Interface实际上就是一个虚函数列表指针.内部封装的只有函数和属性.而且接口(Interface)不能实力化只能通过派生(因为没有构造函数)才可以使用.这一点和抽象类很类似,可是抽象类是个类,他有方法的实现.它所描述的对象是一个无法在现实中具现的对象,但它本身是个类对象.而接口实际上是一种标准.说了这么多,下面我来举一个例子如何在C#中实现多重继承.
例子:
using System;
namespace Intdv{ /// <summary> /// /// </summary> public abstract class myBase { public myBase() { // // TODO: 在此处添加构造函数逻辑 // } }}
using System;
namespace Intdv{ /// <summary> /// /// </summary> public class myDerive1 : Intdv.myBase { string myName; public myDerive1() { // // TODO: 在此处添加构造函数逻辑 //
myName="yarshray"; }
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); }}
using System;
namespace Intdv{ /// <summary> /// /// </summary> public class myDerive2 : Intdv.myBase { int MyAge; public myDerive2() { // // TODO: 在此处添加构造函数逻辑 //
MyAge=21; }
public void ShowMyAge() { Console.WriteLine("my age is :"+ MyAge); }
public void reAge(int a) { MyAge=a; } }
public interface ImyDerive2 { void ShowMyAge(); void reAge(int a); }}
using System;
namespace Intdv{ /// <summary> /// /// </summary> public sealed class myMDerive : Intdv.myBase, Intdv.ImyDerive1, Intdv.ImyDerive2 { Intdv.myDerive1 d1; Intdv.myDerive2 d2; public myMDerive() { // // TODO: 在此处添加构造函数逻辑 // 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);} }}
using System;
namespace Intdv{ /// <summary> /// Class1 的摘要说明。 /// </summary> class Class1 { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) { // // TODO: 在此处添加代码以启动应用程序 // Intdv.myMDerive md=new myMDerive(); md.ShowMyAge(); md.ShowMyName();
md.reAge(22); md.ShowMyAge();
md.reName("saga"); md.ShowMyName(); } }}
事例分析,首先我上在一开始定义了一个基类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托管环境中对象的释放一般也并非人为).
由以上例子,可以看出,实现借口留出函数接口具体实现通过组合的方式来实现多重继承中方法体的实现.这样既保证了单一继承父类的唯一性,又保证了多重继承的优点.我个人认为是个很不错的设计方法,并且在我的程序设计中很多地方都采用了该方法.那么好了,就到这里了.下次