声明了两个接口。有两个实现类。遇到一个问题特来求教。
if1 = interface
procedure show();
end;
if2 = interface
procedure if2show();
end; TShixian = class(TInterfacedObject,if1)
procedure show();
end; TTwo = class(TShixian,if2)
procedure if2show();
procedure TWOPrivate();
end;procedure TShixian.show;
begin
showmessage('if1 show month ');
end;procedure TTwo.if2show;
begin
showmessage('ifwshow TTwo');
end;procedure TTwo.TWOPrivate;
begin
showmessage('this is TTwo private month');
end;以下是调用:
var
if1obj : if1;
if2obj : if2;
begin
if1obj := TShixian.create ;
if1obj.show; //这一句还能理解
if2obj := if2(if1obj); //这一句是把if2obj强转换为if2
if2obj.if2show; //这一句还是会调用TShixian.show;的方法。怎么回事呢。
end;
if1 = interface
procedure show();
end;
if2 = interface
procedure if2show();
end; TShixian = class(TInterfacedObject,if1)
procedure show();
end; TTwo = class(TShixian,if2)
procedure if2show();
procedure TWOPrivate();
end;procedure TShixian.show;
begin
showmessage('if1 show month ');
end;procedure TTwo.if2show;
begin
showmessage('ifwshow TTwo');
end;procedure TTwo.TWOPrivate;
begin
showmessage('this is TTwo private month');
end;以下是调用:
var
if1obj : if1;
if2obj : if2;
begin
if1obj := TShixian.create ;
if1obj.show; //这一句还能理解
if2obj := if2(if1obj); //这一句是把if2obj强转换为if2
if2obj.if2show; //这一句还是会调用TShixian.show;的方法。怎么回事呢。
end;
你那个
var
if1obj : if1;
if2obj : if2;
声明了2个if 并非两个实例of TShiXian and TTWO
所以你的操作中if1转化成if2,对应的相同形式的procedure对应转化了
procedure TForm1.Button2Click(Sender: TObject);
var
if1obj : TShiXian;
if2obj : TTWO;
begin
if1obj := TShixian.create ;
if1obj.show; //这一句还能理解
if2obj := TTWO(if1obj); //这一句是把if2obj强转换为if2
if2obj.if2show; //这才正确
end;
你所说的我当然知道。我是在学习COM接口。
才遇到了这样的情况。
if2obj.if2show; //这一句还是会调用TShixian.show;的方法
是这个地方不太清楚。
就是说:if2obj.if2show; 会调用TShixian.show方法是因为
背后的指针是一样的。所以才会调用的。
我把if2obj := if2(if1obj); //这一句是把if2obj强转换为if2
我自己不是很理解这句。
书上说接口是不分配内存的。既然不分存内存。这么强类型转换又是什么道理呢。
请讲一讲接口强类型转换和类的强类型转换有什么不同。
-可是你转的是个实例啊,包含接口的实例如果两个类不存在继承关系。那如果强类型转换又是怎么个道理。
-很可能是ad错误..
这个时候就会配内存了。
所以我在执行if2obj := if2(if1obj);的时候
其实是把同样的地址赋给了if2obj。
那么所以在执行if2obj.if2show; 的时候,
当然是要执行TShixian.show;的方法了。
但是if2(if1obj); 又怎么理解呢。
if1obj是if1类型的变量。那强类型转换成if2的时候
delphi在背后又作了些什么呢。