接口的单继承多实现是什么意思?

 我来答
宇琳村H
2017-11-24 · TA获得超过163个赞
知道答主
回答量:84
采纳率:65%
帮助的人:14.5万
展开全部
抱歉,你只要提到“接口与继承”,“单继承多实现”这个概念你就绕不开。但什么是“继承”?其实“继承”一词,包含两层含义(大多数人把它们混着来说):
代码重用(功能扩展)
抽象多态
但“单继承”一词的“继承”,只包含上面第一层含义。事实上,大多数人一提起“继承”,大多数人立马会想起代码重用,但却对抽象多态知之甚少。你要明确,除了“单继承”以外,继承的目的可不仅仅限于代码重用上。有不少的材料会说“JAVA/C#不支持多继承,所以用接口来实现多继承”这句话是一种非常不负责任的说法,因为前后两个“继承”根本不是一个意思。但上面1和2在技术上都依赖一个基本特点:(这也是继承的技术本质)
父类/接口的引用可以指向子类的对象!

代码重用有什么好处,我就不详细叙述了,我下面只谈抽象多态有何用。
你学的是JAVA还是C#?如果是前者,继承用extends/implements,后者用“:”,我下面全部用冒号了。

比如说有某个实体类/工具类,里面有个函数要获取某个图形的面积
class Util{ public void F(Shape s) { …… double result=s.CalculateArea(); …… }}

现问题来了,shape类型有很多,不同了图形面积计算方法不一样,如正方形是s=a^2;椭圆面积是s=phai*a*b……那么不同形状图形各整一个类:
class Circle{ public doulbe CalculateArea();}class Square{ public doulbe CalculateArea();}

那么对应的Util类就为这些不同的形状添加F()方法重载?
class Util{ public void F(Circle s); public void F(Square s);}

那么如果有一百个形状呢?要重载一百个F()函数?一亿个呢?好吧,如果一亿个你都咬牙写了一遍。那么你写好,编译好了成为一个动态库,后面又再增加呢?如果你这个动态库要发布给别人使用,这就逼着别人只能用这几个固定的类而不能随心所欲增加新的类。另外,你要重载一亿个F()函数还得都获得这一亿个类的原型声明。这原型一旦做了修改你又得重新编译,多麻烦?
所以多态就要来解决这个问题了:
有了多态,你只需声明一个接口:
interface IShape{ void CalculateArea();}class Util{ public void F(IShape s) { …… double result=s.CalculateArea();//我Util类管你实现的类是什么类?只要你是IShape的子类,我就能调用! …… }}

那么使用者只需要让新增加的形状继承于IShape就可以作为参数调用。
class Circle : IShape
class Square: IShape
而抽象类,则是同时兼顾代码重用和抽象多态的折衷产品。

另外,既然你提到过“单继承多实现”,我就不放再说一说,为什么要有“单继承”?
对比JAVA/C#的单继承,C++是多继承的,所以他不需要专门“接口”。多继承,意味着这种语言完全“面向代码重用”(当然他并不排斥抽象多态)。如何为完全“面向代码重用”呢?就是我写一个类,从A继承一票功能,又从B继承一票功能,又从C…
是大豆茬。必须是年未使用过氯
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式