jinzhili (跑) 问
声明了两个接口。有两个实现类。遇到一个问题特来求教。
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;
关键if2obj.if2show; //这一句还是会调用TShixian.show;的方法
是这个地方不太清楚。
if1obj是被TShixian.create 实例化了。
这个时候就会配内存了。
所以在执行if2obj := if2(if1obj);的时候
其实是把同样的地址赋给了if2obj。
if2(if1obj); 只是个指针,一个内存地址而已,照if2的类型认定的一个obj实例的地址
if1obj是if1类型的变量。那强类型转换成if2的时候
delphi在背后又作了些什么呢。
强转obj 就是用你指定的Tobj的形式认定传过来的东西。对于非指针的操作还有些别的转化。当调用的obj方法指向出现错误,一般就是强转的不对。
if1obj这个obj有和if2obj这个obj一样的函数指针(参数样式、返回值)。把根本不存在if2接口的if1obj转化为if2obj,本身就是危险操作2者传递的不过是个指针,只能说因为2者有个位置和偏移量都一样的函数,没出现错误而已。碰巧了...
就是说:if2obj.if2show; 会调用TShixian.show方法是因为
背后的指针是一样的。所以才会调用的。
这个问题原来在这里