关于接口

唐力伟 2004-09-30 03:37:50
谁能帮解释下,下边的代码,button按第二次非法操作的原因
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
Iaaa = interface(IInterface)
['{6AE1B64C-7680-4AD0-B12C-037B6FC2AC63}']
procedure Member1; stdcall;
end;

Tva = class(TInterfacedObject, Iaaa)
procedure Member1; stdcall;
end;

Tbbb = class(Tva, Iaaa)
public
procedure Member1; stdcall;
end;

Tccc = class(Tva)
procedure Member1; stdcall;
end;

Tddd = class(Tva)
procedure Member1; stdcall;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure callinterface(info:Iaaa);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;

var
Form1: TForm1;
va:TVa;
bbb:Tbbb;
ccc:Tccc;
ddd:Tddd;
implementation

{
************************************* Tva **************************************
}
procedure Tva.Member1;
begin
showmessage('va');
end;

{
************************************* Tbbb *************************************
}
procedure Tbbb.Member1;
begin
showmessage('bbb');
end;

{
************************************* Tccc *************************************
}
procedure Tccc.Member1;
begin
showmessage('ccc');
end;

{
************************************* Tddd *************************************
}
procedure Tddd.Member1;
begin
showmessage('ddd');
end;

{$R *.dfm}

procedure TForm1.callinterface(info: Iaaa);
begin
info.Member1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
va:=Tccc.Create;
bbb:=Tbbb.Create;
ccc:=Tccc.Create;
ddd:=Tddd.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
self.callinterface(va as Iaaa);
self.callinterface(bbb as Iaaa);
self.callinterface(ccc as Iaaa);
self.callinterface(ddd as Iaaa);
end;

end.

写着个代码是为了学习接口的多态.
...全文
113 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐力伟 2004-10-08
  • 打赏
  • 举报
回复
大家说得很对啊...tccc,tddd加上对iaaa的支持的确是解决了接口多态的问题.但是我不明白的地方主要在于为什么第一次按button1的时候可以运行但是第二次按就说访问了非法内存.aaa,bbb,ccc都是在窗体创建的时候建立的,它们没有被析构,为什么接口方法不能被2次调用?接口有生存期么?我曾看过有关有GUID的接口和没有GUID接口的区别(好像和这个有关),但是记不清在哪里看的了,有懂的同志麻烦给讲讲
todouwang 2004-10-01
  • 打赏
  • 举报
回复
感觉你没对程序初始化,并且在使用接口后也许要释放一些资源。
你在button1.click中对程序初始化试试看吧
linzhengqun 2004-10-01
  • 打赏
  • 举报
回复
Tccc = class(Tva)
Tddd = class(Tva)
这两个也要加上Iaaa的支持

va:TVa;
bbb:Tbbb;
ccc:Tccc;
ddd:Tddd;
都定义甩Iaaa类型
最后:
procedure TForm1.Button1Click(Sender: TObject);
begin
self.callinterface(va);
self.callinterface(bbb);
self.callinterface(ccc );
self.callinterface(ddd );
end;
试试




hkbarton 2004-10-01
  • 打赏
  • 举报
回复
Tccc = class(TInterfacedObject,iaaa)
procedure Member1; stdcall;
end;

Tddd = class(TInterfacedObject,iaaa)
procedure Member1; stdcall;
end;

5,379

社区成员

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

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