C#中多重继承

原创 2003年03月31日 09:38:00


其实想写这篇文章,是因为突然在整理论坛上的帖子的时候,突然发现一个人问我如何才能在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托管
环境中对象的释放一般也并非人为).

由以上例子,可以看出,实现借口留出函数接口具体实现通过组合的方式来实现多重继承中方法体的实现.这样既保证了单一继承父类的唯一性,又保证了多重继承的优点.我个人认为是个很不错的设计方法,并且在我的程序设计中很多地方都采用了该方法.那么好了,就到这里了.下次


 

C#接口浅谈(多重继承)

接口是啥? 简单来说就是一种约定,也是C#里面非常重要的. 我们知道在C#中一个派生类(子类)只能由一个父类,那要继承多种状态的时候怎么办呢,这个时候接口来了。 1.接口是一种约定 2.接口是抽...
  • a1455990364
  • a1455990364
  • 2017年04月09日 16:06
  • 485

C#学习日记22---多重继承

继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类来定义一个类,一个类从另一个类派生出来时,派生类从基类那里继承特性          继承的思想实现了 属于(IS-A)...
  • HC666
  • HC666
  • 2015年10月12日 18:44
  • 1754

C++与C#对比学习:多重继承

我们知道C++中类可以多重继承,这也符合现实情况,比如某个绿帽高戴的男同志身边的某位美女可能同时具备几个身份,老婆,小三,孩子他妈.这样的话这位美女得同时继承这三个类.不过由于多继承会有一些缺陷,比如...
  • weiwenhp
  • weiwenhp
  • 2012年09月11日 16:57
  • 2041

C#中基类、派生类以及使用接口来实现多重继承

继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类来定义一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。 当创建一个类时,程序员不需要完全...
  • vs_the_old_boy
  • vs_the_old_boy
  • 2016年08月02日 13:32
  • 1621

模板基链的实现,实现c#的接口,单继承模式

// baselinker.cpp : 定义控制台应用程序的入口点。 //实现一个基类链操作,实现类似C#中接口的功能 //made by davidsu33 //2014-6-8 19:00 ...
  • davidsu33
  • davidsu33
  • 2014年06月08日 19:25
  • 630

C++类的多重继承

C++类的多重继承讲解C++类继承的文章网上很多,但是关于类的多重继承(注意区别多继承和多重继承)的文章并不多。下面是我在写程序的时候遇到的问题以及通过自己实验得到的解决办法。在使用类的继承的时候,一...
  • u010971693
  • u010971693
  • 2017年06月13日 17:32
  • 87

c++ 多重继承歧义及其解决办法

关于c++中多重继承该不该使用的争论不是我们关注的问题,但是现实世界很多模型确实是多重继承类别。和单一继承相比,它比较复杂,也不太好理解,而且多基派生可能会引起二义性。下面我们就说说多重继承可能的二义...
  • zb872676223
  • zb872676223
  • 2014年08月18日 14:20
  • 2345

假言推理:为什么接口可以多重继承,而类不可以

假言推理是根据假言命题的逻辑性质进行的推理。分为充分条件假言推理,必要条件假言推理和充分必要条件假言推理三种。 充分条件假言推理是根据充分条件假言命题的逻辑性质进行的推理。 充分条件假言推理有两条...
  • shyleoking
  • shyleoking
  • 2010年06月21日 18:27
  • 2770

接口多重继承及注意事项

又是一个牛角尖,只是语言不够严谨而已,Java中只支持类的单继承,接口之间的继承同样也是使用extends关键字,但是接口之间是支持多继承的,如下面的例子: interface IP1 { ...
  • qq869348527
  • qq869348527
  • 2016年08月22日 18:52
  • 971

C++ 多重继承

C++ 多继承
  • u011561690
  • u011561690
  • 2015年04月04日 16:41
  • 626
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中多重继承
举报原因:
原因补充:

(最多只允许输入30个字)