C#中实现多继承的方法

2021-04-29 00:11

阅读:689

标签:out   一模一样   那是   声明   class   c#   .com   初学   资料   

近日看到了一个贴子,就是在C#语言中,如何实现多继承的问题。相信涉猎c#不多的人(像我这样的菜鸟),一看就觉得很可笑,c#肯定是不能实现多继承的啊。都知道在c++中因为实现多继承会有很多的歧义问题,所以在c#中就把多继承给取消了,而用接口来实现!但是想想,如果是初学者肯定不会不会问这样的问题。肯定是个高手,然后就开始上网查资料!然后发现真的可以实现!

说起多继承,首先大家可以想想这个问题:你知道在C#中怎么实现多继承吗?

主流的答案无非2种。

答案一:用接口啊,一个类可以继承自多个接口的。

答案二:C#不支持多继承,C++才支持多继承,多继承会让代码变得很乱,因此微软在设计C#的时候放弃了多继承。

能够知道答案二的人显然懂的更多,我也在很长一段时间内相信C#不支持多继承,直到2013年5月的一个项目中,我偶然的发现自己的代码就完全实现了真正意义的多继承。

先说说什么是真正意义的多继承。真正的多继承应该是像C++那样的,而不是说像在C#里面一个类继承了多个接口就叫多继承。在C#中,如果一个类实现了多个接口,那么要为每个接口写实现,如果接口被多个类继承,那么就会有重复的代码,这显然是无法接受的。

然而C++那样的多继承也确确实实给编码带来了很大的麻烦,我也相信微软真的是因为意识到了多继承的不合理之处才在C#中摈弃了这个特性。而我在C#中实现的多继承,第一是真正的多继承,第二代码写的很合理。


请看案例

假如你有一个类叫老虎,还有一个类叫苍蝇。现在你想新创一个超级老虎类,一种可以飞的老虎。在C++中,你可以定义一种超级老虎类,让其继承自老虎和苍蝇,这样这种老虎就可以飞了。然而,问题出现了,这种超级老虎由于同时也继承自苍蝇,而苍蝇下面有个方法叫吃,参数类型是屎。吃屎的这个方法显然跟我们的超级老虎太不搭了。

虽然这个例子有些夸张,但是很多C++程序员真的就是这样在设计代码。由于子类继承了多个父类,而多个父类肯定有些成员跟这个子类不搭调,于是子类的调用者就很难受了。比如上面这个例子,当调用者拿到超级老虎的一个实例时,发现超级老虎下面怎么会有个吃屎的方法呢!!!真的是要笑死人了。

C++要这样允许多继承就必然会造成这个问题。C#程序员就绝对不会写出这样滑稽的代码。对于C#程序员,肯定是要把这个飞的方法提成接口的,然后让苍蝇类和超级老虎类都继承自这个接口。这样,苍蝇会飞,超级老虎也会飞。是不是完美解决这个问题?

问题看上去解决了,但是,假如我跟你说苍蝇飞的方法跟超级老虎飞的方法需要一模一样:首先张开双翅,身体前倾,拍打双翅,起飞,继续拍打。我们肯定不能把同一份代码copy一份吧,那是属于入门级程序员干的事,我们现在已经没资格干那事了。那怎么办呢?简单快速的做法是使用静态方法,比如FlyHelper.Fly(…)。

静态方法解决了代码重用的问题,但写起来始终觉得哪里不对劲。我的超级老虎类和苍蝇都明明继承了飞了啊,为什么还要这样调用一句静态方法。如果以后哪天我想让我的猪也能飞起来,那岂不是还要来调用这个静态方法。

到底怎样才能在C#中实现像C++那样优雅的继承呢?


答案揭晓

答案其实很简单,那就是给IFly接口写扩展方法。

首先请看这个空接口的定义,及其扩展方法(注意泛型限制):


代码如下:


namespace Interface

{

//飞的接口

public interface IFly

{

}

//扩展方法

public static class ExtendFly

{

public static void StartFly(this T example) where T : IFly

{

Console.WriteLine(“准备”);

Console.WriteLine(“张开双翅”);

Console.WriteLine(“起飞”);

Console.WriteLine(“我飞,我飞,我飞飞飞”);

}

}

}

再看老虎和苍蝇的实现:


代码如下:


namespace Interface

{

//苍蝇类实现飞的接口

public class flies : IFly

{

public void fly()

{

//调用接口中飞的方法

this.StartFly();

}

}

}

namespace Interface

{

//老虎类

public class Tiger

{

public void introduce()

{

Console.WriteLine(“I am a tiger”);

}

}

}

再看超级老虎的实现:


代码如下:


namespace Interface

{

//超级老虎类,继承了老虎类,并实现了飞的方法

public class SuperTiger : Tiger, IFly

{

public override void introduce()

{

Console.WriteLine(“大家好,我是超级老虎哦!”);

}

public void TigerFly()

{

//调用接口中飞的方法

this.StartFly();

}

}

}

除声明外,跑步客文章均为原创,转载请以链接形式标明本文地址
  C#中实现多继承的方法

本文地址:  http://www.paobuke.com/develop/c-develop/pbk23573.html




相关内容

技术分享
详解C#中三个关键字params,Ref,out
技术分享
详解C#中的接口属性以及属性访问器的访问限制
技术分享
C#编程中使用ref和out关键字来传递数组对象的用法
技术分享
轻松学习C#的读写操作

技术分享
asp.net中调用oracle存储过程的方法
技术分享
初步认识C#中的Lambda表达式和匿名方法
技术分享
C#中datatable序列化与反序列化实例分析
技术分享
WinForm中的几个实用技巧汇总

C#中实现多继承的方法

标签:out   一模一样   那是   声明   class   c#   .com   初学   资料   

原文地址:http://www.cnblogs.com/paobuke/p/7828243.html


评论


亲,登录后才可以留言!