通过接口传递或创建继承该接口的类呢?小弟急。。愿拿500分。 ( 积分: 200 )

  • 主题发起人 主题发起人 lsx1982
  • 开始时间 开始时间
L

lsx1982

Unregistered / Unconfirmed
GUEST, unregistred user!
一个Com例子:
TSipCall=class(TAutoObject,ISipCall)
private
FSip:TSip;
protected
procedure TestA(Sip:ISipCall); safecall;
public
其中TSipCall的TestA方法实现:
procedure TestA(Sip:ISipCall); safecall;
var
Temp:TSipCall;
begin
Temp:=TSipCall(Sip);//注释1
Temp.FSip.ConnectA;
end;
注释1: 我知道这是非法的,但是如何通过接口传递或重新创建继承接口的类TSipCall呢?然后可以使用该类的属性或方法呢?能不能举个例子呀。谢谢。
小弟急呀。。愿拿出500分。。谢谢
 
不太明白你的意思,我想应该把Temp定义成TSipCall的类类型。
 
Temp.FSip.ConnectA;
这个访问的私有成员。
TSip也应该有一套自己的接口
 
iamy 说的好。不过,我从例子中看到的,仅就这个问题的讨论,应该与“接口”没有关系。

例子中,似乎象是讨论:“我如何才能访问到 TSipCall 中的私有成员 FSip”。
简单地,直接引出一个访问的方法应该就可以了,复杂点的、技巧点的,可以找找 aimingoo
从内存角度论述的“私有成员”的访问的文章。文章中有告诉你如何直接突破“私有”的限
制,让一个已经成型的类,不改造源代码就可以访问他的“私有”成员。

地址 : http://www.delphibbs.com/keylife/iblog.asp?author=aimingoo
 
不好意思,谢谢的你们的观点,我们暂且不讨论私有成员的话题。
我改一下我的方法

其中TSipCall的TestA方法实现:
procedure TestA(Sip:ISipCall); safecall;
var
Temp:TSipCall;
begin
Temp:=Sip;//注释2
Temp.FSip.ConnectA;
end;

注释2: 接口转换为类是不行的。这个我知道,但是如何修改我程序,能使传一个接口参数ISipCall进来,然后可以这个接口参数,创建TSipCall的类,然后可以调用FSip中的ConnectA的方法呢。。?
请高手再指教。
 
无解!

一个接口,可以是 TSipCall 类实现的,也可以是 TXXXXX 实现的。接口无性,否则就不是
接口了。一个无性的东西,一定要把它搞大肚子,它就必须依付于某个确切有性的类别,而
这个类别是没有限制的,并不是因为你写了 TSipCall 类来实现它,它就和 TSipCall 类相
关了,事实上,我可以用 TXXXXX 来实现,你如何知道还在我脑中的 TXXXXX 类是什么东西
呢?我这个 TXXXXX 类一定会写一个 FSip:TSip 成员吗?

你的“接口”概念犹如一行白鹭,继续这样的讨论,会影响你对接口的理解的。
 
“能使传一个接口参数ISipCall进来,然后可以这个接口参数,创建TSipCall的类”——不能
但可以这样
ISip = Interface
['{70F4595B-DE83-4D5A-A5DB-54F0B6830F45}']
procedure ConnectA;
end;

TSip = class(云云,ISip)
public
procedure ConnectA;
end;

用的时候调用GetInterface
取得ISip
然后你揍可以使用ISip.ConnectA了
 
你应该把接口模型与类模型分开
先做一个带有GUID接口
然后再写一个支持它的所有方法的类
然后定一个接口实例,并且用类的Create方法将创建的实例赋给接口就可以了
 
后退
顶部