下面是学习接口时的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并未创建。
后面隐藏着什么呢?请大家指点。
解决方案 »
- Delphi如何判断这个窗口是否在最前?是则执行程序。
- indy问题,请帮帮,解决了马上给分!
- 又有小问题,麻烦大家了.COMBOBOX.ITEMS的.
- 在应用程序中CreateOleObject后,运行没有问题。但是写在DLL中就有问题,提示说“尚未调用Coinitialize”,请指教!顶者有分!
- 多线程同步问题?请大家帮忙?
- 寻求Tcpipclient,Tcpipserver的详细说明文档,最好有用他们编写聊天工具的实例
- 如何将数组内容显示,比如showmessage,代码怎么写?
- 自定义文件储存的问题,我是否该每次都更新索引的位置
- 请问:ListView和TreeView问题?
- 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未申明为类方法也可以直接执行这是我没想到的。
其执行机制可否给介绍下。