接口的单继承多实现是什么意思?
发布网友
发布时间:2022-04-18 13:46
我来回答
共1个回答
热心网友
时间:2022-04-18 15:16
抱歉,你只要提到“接口与继承”,“单继承多实现”这个概念你就绕不开。但什么是“继承”?其实“继承”一词,包含两层含义(大多数人把它们混着来说):
代码重用(功能扩展)
抽象多态
但“单继承”一词的“继承”,只包含上面第一层含义。事实上,大多数人一提起“继承”,大多数人立马会想起代码重用,但却对抽象多态知之甚少。你要明确,除了“单继承”以外,继承的目的可不仅仅限于代码重用上。有不少的材料会说“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…
是大豆茬。必须是年未使用过氯