声明了两个接口。有两个实现类。遇到一个问题特来求教。
  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;

解决方案 »

  1.   

    试验后觉得
    你那个
    var
      if1obj : if1;
      if2obj : if2;
    声明了2个if 并非两个实例of TShiXian and TTWO
    所以你的操作中if1转化成if2,对应的相同形式的procedure对应转化了
      

  2.   

    要是声明
    procedure TForm1.Button2Click(Sender: TObject);
    var
      if1obj : TShiXian;
      if2obj : TTWO;
    begin
      if1obj := TShixian.create ;
      if1obj.show;    //这一句还能理解
      if2obj := TTWO(if1obj);  //这一句是把if2obj强转换为if2
      if2obj.if2show;         //这才正确
    end;
      

  3.   

    to :kaguo(▲)Guozhi(★★★★★) 
    你所说的我当然知道。我是在学习COM接口。
    才遇到了这样的情况。
    if2obj.if2show; //这一句还是会调用TShixian.show;的方法
    是这个地方不太清楚。
      

  4.   

    if1obj这个obj有和if2obj这个obj一样的函数指针(参数样式、返回值)。你把根本不存在if2接口的if1obj转化为if2obj,本身就是危险操作2者传递的不过是个指针,只能说因为2者有个位置和偏移量都一样的函数,没出现错误而已。碰巧了...
      

  5.   

    哦,我有点明白了。
    就是说:if2obj.if2show; 会调用TShixian.show方法是因为
    背后的指针是一样的。所以才会调用的。
    我把if2obj := if2(if1obj);  //这一句是把if2obj强转换为if2
    我自己不是很理解这句。
    书上说接口是不分配内存的。既然不分存内存。这么强类型转换又是什么道理呢。
    请讲一讲接口强类型转换和类的强类型转换有什么不同。
      

  6.   

    to jinzhili(跑) 书上说说接口是不分配内存,
    -可是你转的是个实例啊,包含接口的实例如果两个类不存在继承关系。那如果强类型转换又是怎么个道理。
    -很可能是ad错误..
      

  7.   

    if1obj是被TShixian.create 实例化了。
    这个时候就会配内存了。
    所以我在执行if2obj := if2(if1obj);的时候
    其实是把同样的地址赋给了if2obj。
    那么所以在执行if2obj.if2show; 的时候,
    当然是要执行TShixian.show;的方法了。
    但是if2(if1obj); 又怎么理解呢。
    if1obj是if1类型的变量。那强类型转换成if2的时候
    delphi在背后又作了些什么呢。
      

  8.   

    我不说了么那只是个指针,一个内存地址而已,照if2的类型认定的一个obj实例的地址
      

  9.   

    强转obj 就是用你指定的Tobj的形式认定传过来的东西。对于非指针的操作还有些别的转化。当调用的obj方法指向出现错误,一般就是强转的不对。