关于接口的疑问,求指点

kv2002 2011-05-30 01:16:00
下面是学习接口时的Demo

unit Unit1;

interface

uses
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并未创建。
后面隐藏着什么呢?请大家指点。
...全文
116 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kv2002 2011-05-30
  • 打赏
  • 举报
回复
多谢几位指点,应该是sanguomi指出的问题。
T1未申明为类方法也可以直接执行这是我没想到的。
其执行机制可否给介绍下。
yqdragon 2011-05-30
  • 打赏
  • 举报
回复

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;

sanguomi 2011-05-30
  • 打赏
  • 举报
回复
这个和接口没什么关系

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;

dropme 2011-05-30
  • 打赏
  • 举报
回复
学习,帮顶,蹭分~
专制的网站 2011-05-30
  • 打赏
  • 举报
回复
个人理解,是这样的 :(仅供参考)
1、接口部分,内容是 “借口的委托”-“使用类对象委托”(InsideVCL中有讲)

2、sv并未创建,但不报错。是∵WashClothing是 类方法(不是虚拟/动态方法),他的内存地址在编译时已经确定了相对内存地址,调用他时,编译器只须简单地产生调用他的相对地址即可... (InsideVCL 2-7 有相关内容)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧