DELPHI中Interface的问题

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方法是因为
背后的指针是一样的。所以才会调用的。

这个问题原来在这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值