type
  IFood = interface
  ['{D68E13A0-852B-4189-ACA3-CEF35314030F}']
    function show:string;
    function get:string;
  end;  TRunable = class(TInterfacedObject,IFood)
    function showFood:IFood;
    property Foot:IFood read showFood implements IFood;
  end;  function TRunable.showFood:IFood;
  begin
    writeln('Hello');
  end;
var
  run : TRunable;
begin
  { TODO -oUser -cConsole Main : Insert code here }
  run := TRunable.Create;
  run.showFood;
  readln;
end.
、、、、、、、、、、、、、
在TRunable中并没有实现IFood的show,
甚至没有委托实现get但还是可执行,
这是否能说明implements后,不必将所有接口内方法实现 
但到底是Foot这个字段受委托还是showFood受委托了?? 

解决方案 »

  1.   

    但是FOOT并没有实现show,
    这是不是说只要implements就算是实现了??
    还有get方法可什么都没有啊。
    是不是不实现也可以??
      

  2.   

    呵呵。你被假象蒙蔽了哈。形象化的说:老板委托你去买米,而你也接受了任务,但实际你先打游戏去了,提着空米袋回来告诉老板:“米我买回来了哈”,而这时开饭时间没有到,厨师也没有去打开米袋看到底有没有米。其实并没有内存中并没有IFood的任何实例存在,但为什么能执行呢?因为这段代码中ShowFood在执行完writeln('Hello')返回了一个nil指针而不是IFood的实例指针。为了验证,你可以这样加几条语句看看:var
      run : TRunable;
      food: IFood;
    begin
      { TODO -oUser -cConsole Main : Insert code here }
      run := TRunable.Create;
      run.QueryInterface(ifood, food);
      if food <> nil then
        writeln('FOOD在内存里了);
      readln;
    end.
      

  3.   

    这样该类还算不算对该接口实现?
    food := TRunable.create();
    加入这句后程序依然正常。
    这样的话具体有体现了什么呢?
      

  4.   

    你还是好好看看李维的《Inside VCL FrameWork》277页-363页吧,李首席讲得透彻得不得了。
      

  5.   

    一时间就要找书,小弟没这书,
    大家如有电子书请传给我,先谢啦.
    [email protected]