下面是学习接口时的Demounit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  IWasher = interface
  ['{978C4D69-2B79-451D-A8DA-E843EB28138B}']
    procedure WashClothing;
  end;  IRemover = interface
  ['{9431B14D-2A6D-4F08-997F-47F0A62CE7D5}']
    procedure MoveThing;
  end;
  TWasher = class(TInterfacedObject,IWasher)
    procedure WashClothing;
  end;
  TRemover = class(TInterfacedObject,IRemover)
    procedure MoveThing;
  end;  TSvrCenter = class(TInterfacedObject, IWasher,IRemover)
  private
    FWasher: TWasher;
    function FindRemover :IRemover;
  public
    constructor Create;
    destructor Destroy;override;
    property Washer :TWasher read FWasher implements IWasher;
    property Remover :IRemover read FindRemover implements IRemover;
  end;  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}{ TSvrCenter }constructor TSvrCenter.Create;
begin
  inherited;
  FWasher := TWasher.Create;
end;destructor TSvrCenter.Destroy;
begin
  FWasher.Free;
  inherited;
end;function TSvrCenter.FindRemover: IRemover;
begin
  result := TRemover.create;
end;{ TRemover }procedure TRemover.MoveThing;
begin
  ShowMessage('move');
end;{ TWasher }procedure TWasher.WashClothing;
begin
  ShowMessage('Wash');
end;procedure TForm1.Button1Click(Sender: TObject);
var
  sv :TSvrCenter;
begin
  //sv := nil;
  sv.Washer.WashClothing;
end;end.Delphi6中执行时   sv.Washer.WashClothing; 可以正确执行,比较疑惑。sv并未创建。
后面隐藏着什么呢?请大家指点。

解决方案 »

  1.   

    个人理解,是这样的 :(仅供参考)
    1、接口部分,内容是 “借口的委托”-“使用类对象委托”(InsideVCL中有讲)2、sv并未创建,但不报错。是∵WashClothing是 类方法(不是虚拟/动态方法),他的内存地址在编译时已经确定了相对内存地址,调用他时,编译器只须简单地产生调用他的相对地址即可... (InsideVCL 2-7 有相关内容)
      

  2.   

    这个和接口没什么关系  Test = class
      public
        procedure T1();
      end;procedure Test.T1;
    begin
      ShowMessage('Test.T1');
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      T: Test;
    begin
      T.T1;
    end;
      

  3.   


    sv :TSvrCenter;并未使用接口
    使用接口应该为
    procedure TForm1.Button1Click(Sender: TObject);
    var
      sv :IWasher;
    begin
      sv := TWasher.Create;
      sv.WashClothing;
    end;
    接口通过类来实现
    你只是使用了类而已,试试以下有什么不同
    TCS=class
      public
        s:string;
        procedure show;
      end;procedure TForm1.Button2Click(Sender: TObject);
    var
      ss:TCs;
    begin
      ss.show;
      ss.s := 'dddd';
      edit1.text:=ss.s;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      ss:TCs;
    begin
      ss := tcs.Create;
      ss.show;
      ss.s := 'dddd';
      edit1.text:=ss.s;
      ss.Free;
    end;
      

  4.   

    多谢几位指点,应该是sanguomi指出的问题。
    T1未申明为类方法也可以直接执行这是我没想到的。
    其执行机制可否给介绍下。