5,386
社区成员
主要是风险规避, delphi , java之类的语言更易用就在于给开发人员规避了一些风险, 虽然丧失了一些灵活性,但更好用了
比如说A同时继承B,C但是B,C两个类同时拥有相同原型的两个函数,那么在A实例话时候调用该function时候就可以存在问题,故不提倡类的多重继承,所以多重继承用接口相对安全,可以避免很多因为原型相同在继承时候出现不必要的潜在危险
@ooolinux
如果这书说了多重继承的派生类也只有一个VMT(vtable)的话,那肯定是错的。
应该是每个VMT指针在实例中的偏移位置不固定(除了第一个VMT指针和单继承的实例布局一样位于偏移0),不是只有一个VMT。
就我看到,各个C++编译器生成的实例布局都是这样的:
第一个VMT指针
第一个基类的数据
第二个VMT指针 //
第二个基类的数据 //
... // 单继承就没有这些了
派生类自己的数据
另外,派生类新增的虚函数,其函数指针会附加在第一个VMT的后部(和单继承的情况一样)
确实是不同类别的概念,与接口类似的是抽象类。
但是单继承的类架构,通过实现多重接口,可以模拟多重继承,于是两者也就有了联系。
在Delphi中还有一个接口委托实现机制,每个接口可以只实现一次,其他实现该接口的类都可以通过一个实现该接口的对象(实例)来委托实现,就好像自己也把该接口实现了一样。这样可以减少很多代码,而且能够减缓多重继承的类膨胀问题。
D6之前,接口是对应Windows COM接口的架构设计的,但是从D6开始,已经是独立的语言特性。
多重继承(我认为你指的是类的多重继承)就好比你从几个师父那里习得武功,堪称绝世高手;但是如果你同时修习《九阳神功》和《九阴真经》,却没有习得《易筋经》,那这两门特性相冲的内功将使你爆体而亡。
接口就很简单、规范、通用,与功能的实现没有关系,优点同时也是缺点,如果你不能掌控接口的参数类型,同样要爆体而亡。
似乎只有C++采用了类的多重继承,而其他语言都选择了接口多重实现,原因无怪乎类的多重继承过于复杂,而接口更易实现。
臆测,Delphi选择接口还与 Windows 的 COM 机制有关。