接口编程 Interface如何转换成类变量

苏丹-陈 2004-09-22 10:33:01
有一个函数返回 IResource接口变量。
我如何把它转换成 TResource. 函数返回前创建的对象的确是TResource对象。
TResource = class(TMyIntfObject,IResource).
现在我得到的返回值。在做其它操作时报错。意思是地址访问冲突。还有其它错误。
...全文
229 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
苏丹-陈 2004-11-22
  • 打赏
  • 举报
回复
所有接口,都继承之自定义的接口基础接口,基础接口定义函数
function getMyObject():TObject;
实现类实现这个方法。
就可以通过接口得到类变量,类变量再强制转换成接口的实现类。
苏丹-陈 2004-09-24
  • 打赏
  • 举报
回复
为什么我将接口变量强制转换成类变量就出错。
类变量访问出错。没有正确得到原来类的指针变量。
苏丹-陈 2004-09-24
  • 打赏
  • 举报
回复
TMyIntfObject = class(TObject,IInterface)
...
end;
_AddRef _Release都直接返回 -1
begin
Result := -1;
end;
到单位我再发全一点。按照李伟的 VCL框架。。。 那本书里好像也是这样说。
麻烦 halfdream(哈欠) 你了!
angelface 2004-09-23
  • 打赏
  • 举报
回复
这种情况用强制转换是最好的了,(其实应该说是向下转型) 该出手时就出手么,
halfdream 2004-09-23
  • 打赏
  • 举报
回复
楼主怎么实现的?
苏丹-陈 2004-09-23
  • 打赏
  • 举报
回复
我的基础类 TMyIntfObject 已经实现了自己的 _Release函数,没有让它干扰对象的生命周期,为什么还是不行呢。很着急啊!!!!!
halfdream 2004-09-23
  • 打赏
  • 举报
回复
建议
整理一下所有的类,特别理清逻辑依赖关系。总能够整理出基础类,架构主干的类,应用类等
类的层次与里外。靠传递INTERFACE再强制转换很不安全的,这样甚至远不如你传TOBJECT类型再利用RTTI机制判断类型后强制转换,

halfdream 2004-09-23
  • 打赏
  • 举报
回复
function getResource:IResource;
var
m_Resource:TResource;
begin
m_Resource := TResource.create();
result := m_Resource;//楼主留意这儿,这儿实际是将这个对象赋给一个接口IResource的引用。
//调用返回后,这个引用会立即失去,引用计数会被减1。
//如果不找个中间变量维持引用,对象会被释放掉。
end;

welllove88 2004-09-23
  • 打赏
  • 举报
回复
不能转换 只能利用接口引用
苏丹-陈 2004-09-23
  • 打赏
  • 举报
回复
为什么要用接口是因为实现的类很多,Delphi又不能 A uses B
B uses A,所以定义一个unit,包含所有interface。其它unit都直接引用 这个unit
想在具体使用时,强制转换回类变量。但是现在就遇到这个问题了。
不知道大家有什么 好的解决方法没有! 非常感谢。
苏丹-陈 2004-09-23
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3399/3399849.xml?temp=.2651178
你好,我已经不使用引用计数进行生命周期控制了,为什么还要使用了中间变量,保持引用计数.
但是我试了一下的确再通过中间接口变量,过渡一下,转换成实现类变量后,可以调用类变量的方法,否则会保存。
不明其中原因,不使用引用计数控制生命周期,为什么Delphi还会释放变量?
还有一点疑惑:我在调试时,没有通过中间接口变量过渡,看到的类变量内容和范围函数前的类变量的内容不一致。例如:
TResource = class(TMyInfoObject,IResource);
function getResource:IResource;
var
m_Resource:TResource;
begin
m_Resource := TResource.create();
result := m_Resource;
end;
function useResource:Boolean;
m_myResource:TResource;
begin
m_myResource := TResource(getResource());
m_myResource.setSystemId('http://www.csdn.net'); //调用出错。
end;
halfdream 2004-09-23
  • 打赏
  • 举报
回复
可以强制转换的. 但很不安全,

假定function xxxx:IResource;

var
a:TResource
aintf:IResource;

aintf:=xxxx;//使用了中间变量,保持引用计数.
a:=TResource(aintf);

FrameSniper 2004-09-22
  • 打赏
  • 举报
回复
接口与其实现类是赋值兼容的且只与直接实现的类赋值兼容。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧