关于delphi的多继承问题?(小问题,要答赶快)(50分)

  • 主题发起人 主题发起人 李璋琦
  • 开始时间 开始时间

李璋琦

Unregistered / Unconfirmed
GUEST, unregistred user!
关于delphi的多继承问题?那位大虾能讲一下
 
Delphi不直接支持多重继承
 
好像可以用接口间接实现,不过没试过。
 
Delphi 只能用interface+class实现多重继承,而不能直接通过类来多重继承。
哇,太抽象了,你不会是在考试吧。
 
我想,DELPHI应该不会输给pb的(pb的继承很容易的)
虽然我没试过DELPHI的多重继承!
 
我想,DELPHI应该不会输给pb的(pb的继承很容易的)
虽然我没试过DELPHI的多重继承!
 
Delphi的对象不支持多重继承,
但允许从一个Interface和一个Object共同继承出子类,
比如Midas中服务器程序的RemoteDataModule就是:
TXXXX = class(TRemoteDataModule, IXXXX)
....
end;
看来没什么实际的用处。
我也曾遇到这样的问题,
想给所有的TWinControl一起打个补丁,
结果没实现。

不过Delphi改进许多语法上的限制,
就是允许过程和函数的多态定义:
procedure SomtProc(var Var1:Integer);overload;
procedure SomtProc(var Var1:String);overload;
procedure SomtProc(var Var1,Var2:Integer);overload;
......

另外还允许指定参数的缺省值,
如果调用时没有指定该参数,就认为是缺省值:
procedure SomtProc(var Var1:Integer=0);

现在看来基本上没有什么限制了,除了多重继承外,
我觉得多重继承其实不是什么很好的习惯,
太自由了,不符合Pascal的风格,
虽然有些情况下很方便。。。。
如果投票,我不赞成允许多重继承。
 
menxin:
讲的太简单了.能否给一段简单的代码?
 
可以看看Delphi的源码。
 
此问题已经堆积超过一个月了,请结束问题或继续讨论 :)
 
我建议你看看delphi 3(4) 从入门到精通
 
我也有个类似的问题,呵呵,倒霉
 
cj, 想做什么样的多继承, 能否讲一下。我的一个学生特别喜欢你。
其实多继承类的问题可以通过另一种方法来实现,那就是在一个类里面动态生成另外
的一个类,其实Intaface Object的实质也是一个类里面使用IDispatch方法。
 
HI 会长:实际上我并没有在实际运用中使用多重继承,是和Z-CD小伙子聊天
聊出的事情,详细见:<A href = "http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=114865">here</a>
不过经过此次事件,CJ发奋图强,仔细学习,对这东西多少也有了点了解。今天看了
IBO实现的架子,正好是如此:自己继承一个类然后实现另一个接口,从而达到和VCL
DB-AWARE COMPONENT兼容。建议提问着多看源码,好处多多。

什么?特别喜欢我?????CJ 没人喜欢:((
劝这位:不要学CJ,要学会长:-)

真应该好好请教会长,编程也好E文也罢,可惜啊

 
Delphi也可以进行多重继承的,但我没用到,方法为:
parent=Class();
...
sub1=Class(Parent);
..
sub2=Class(Sub1);
子孙类的方法可以继承其父辈的各方法,且也可重载。
 
多重继承的实际应用我只有在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的编程.
 
多人接受答案了。
 
后退
顶部