多重继承的实际应用我只有在OWL和Application FrameWorks版类库中见过,
MFC中好像也不用的,JAVA 和Delphi一样只有接口。
有的时候,使用“在一个类里面动态生成另外的一个类”是无法代替多重继承的。
如:
TDBEdit同时具有Edit特性又具有DB-AWARE特性,在Delphi中只能用在一个类
里面动态生成另外的一个类(TFieldDataLink)来实现。但是比如实现这样一个
函数:
从DB-AWARE对象中返回其所连接的DataSource,
如果Delphi支持多重继承,可以这样实现:
TDBEdit = Class(TCustomMaskEdit, TFieldDataLink)
...
end;
function getDBCtrlDataSource(Control: TFieldDataLink): TDataSource;
begin
result := DataSource
//从TFieldDataLink继承来的属性
end;
但是,实际上Delphi不支持多重继承,要实现一个通用的能够对一切DBCtrl(现有
的、未来的、自己写的、别人写的)都适用的getDBCtrlDataSource是不可能的.
function getDBCtrlDataSource(Control: TControl): TDataSource
begin
if Control is TDBText then
else if Control is ...
...
end;
定义接口可以解决这个问题,比如DB-AWARE特性用接口IDBAware定义
IDBAware = interface
function getDataSource: TDataSource;
end;
TDBEdit = Class(TCustomMaskEdit, IDBAware)
function getDataSource: TDataSource;
end;
但是,可惜的是,Delphi绝大部分核心代码都是在接口语法出现之前实现的,
VCL在设计时,就不可能利用到接口特性,对于Borland这个擅长多重继承的公司
来说,不可能不充分利用接口特性的.实际上,在Delphi中Interface常常只是
用来简化OLE的编程.