关于从基类到派生类的类型转换问题(100分)

  • 主题发起人 主题发起人 灵犀指
  • 开始时间 开始时间

灵犀指

Unregistered / Unconfirmed
GUEST, unregistred user!
IMethodRequest =interface
['{614E5F74-B0FD-4A17-92D7-8AC22D84BAFF}']
procedure Call();
end;

TActiveQueue =class
private
Fqueue: TObjectStack;
procedure Setqueue(const Value: TObjectStack);
public
constructor Create()

published
property queue :TObjectStack read Fqueue write Setqueue;
procedure enqueue(mr :IMethodRequest);
function dequeue():IMethodRequest;
end;

function TActiveQueue.dequeue: IMethodRequest;
var
mr:IMethodRequest;
begin
mr :=queue.pop() as IMethodRequest;
result := mr;
end;
由于queue.pop()返回的对象是TObject类型,而函数需要返回IMethodRequest,我该如何改代码?
 
queue.pop()返回的一定是一个对象,也一定是TObject的子类,问题是queue.pop()返回的对象
是不是IMethodRequest的实现类或其子类呢?
如果是的话

IMethodRequest :=queue.pop();
就可以了

当然 你也可以写成
result := queue.pop();

总之 接口需要它的实现类(或者实现类的子类)来实例化

 
谢谢AIHUA的回答。我放进栈里的本来就是IMethodRequest
procedure TActiveQueue.enqueue(mr: IMethodRequest);
begin
queue.push(TObject(mr));
showmessage('Leave Queue');
end;
并且IMethodRequest的实现类是
TSayHello =class(TInterfacedObject,IMethodRequest)
private
Fservice: IService;
procedure Setservice(const Value: IService);
public
constructor Create(s:IService);
published
Property service:IService read Fservice write Setservice;
procedure Call();
end;
不知道我pop()进栈内的应该是实现类还是接口类,请各位大侠不吝赐教。代码如何修改?
类型如何转换?
 
后退
顶部