下面是学习接口时的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并未创建。
后面隐藏着什么呢?请大家指点。
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并未创建。
后面隐藏着什么呢?请大家指点。
解决方案 »
- RxRichEdit的问题。关注也加分!
- 关于字段编辑器的问题.........
- 有宁波的程序员吗?研究DELPHI+SQL用三层结构的!!!进来聊聊啊!
- 请教高人!!!!!!!!!!!!!!
- ADO的臭虫、问题太多,只好用BDE了
- 一个关于 在form最小化时绘制form的小技巧.MS提供,但本人试了一下.为何不好使???????有兴趣进来一下
- 在线等待,急!
- delphi怎么编写聊天程序啊?
- csdn上这篇文章果然有趣!居然有这种文章
- 项羽 在么?那个程序有没有 Delphi 版本的?(有关数据结构的)
- delphi小程序抓图后自动保存 ?
- delphi灰度图像的形态学运算(腐蚀,膨胀等)及结构元素的选取与表示?
1、接口部分,内容是 “借口的委托”-“使用类对象委托”(InsideVCL中有讲)2、sv并未创建,但不报错。是∵WashClothing是 类方法(不是虚拟/动态方法),他的内存地址在编译时已经确定了相对内存地址,调用他时,编译器只须简单地产生调用他的相对地址即可... (InsideVCL 2-7 有相关内容)
public
procedure T1();
end;procedure Test.T1;
begin
ShowMessage('Test.T1');
end;procedure TForm1.Button1Click(Sender: TObject);
var
T: Test;
begin
T.T1;
end;
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;
T1未申明为类方法也可以直接执行这是我没想到的。
其执行机制可否给介绍下。