接口问题欢迎大家探讨 ( 积分: 300 )

  • 主题发起人 主题发起人 田伯光
  • 开始时间 开始时间

田伯光

Unregistered / Unconfirmed
GUEST, unregistred user!
我有两个及不相关的两个类如TA和TB

他们都需要处理一个相同的事件例如Export。那么我们可以利用接口实现对于这个事件的统一。例如我们定义

iExport = interface
procedure export();
end;

TA = class( TEdit , iExport )//这里的TEdit只是举一个例子
private
public
procedure export();
end;

TB = class( TForm , iExport )//这里的TForm也只是举一个例子
private
public
procedure export();
end;

但是这样就意味着这两个类都必须分别实现这个Export事件。但是我的这个Export事件又是具有[通用性]的东东。
也就是说,在TA和TB中,这两个Export中的代码可以复用,至少可以部分复用。
所以我就不想在两个事件中分别写不同的方法。

想让这个方法能够一次实现。也就是只写一次代码,我应该如何处理才能达到这个代码复用的功能呢?

好像Implement可以实现类似的功能,不过手头的资料又不是很充分,希望高手给予指点。。。

当然我不能去处理TWinControl或者TObject。。。。。
 
我有两个及不相关的两个类如TA和TB

他们都需要处理一个相同的事件例如Export。那么我们可以利用接口实现对于这个事件的统一。例如我们定义

iExport = interface
procedure export();
end;

TA = class( TEdit , iExport )//这里的TEdit只是举一个例子
private
public
procedure export();
end;

TB = class( TForm , iExport )//这里的TForm也只是举一个例子
private
public
procedure export();
end;

但是这样就意味着这两个类都必须分别实现这个Export事件。但是我的这个Export事件又是具有[通用性]的东东。
也就是说,在TA和TB中,这两个Export中的代码可以复用,至少可以部分复用。
所以我就不想在两个事件中分别写不同的方法。

想让这个方法能够一次实现。也就是只写一次代码,我应该如何处理才能达到这个代码复用的功能呢?

好像Implement可以实现类似的功能,不过手头的资料又不是很充分,希望高手给予指点。。。

当然我不能去处理TWinControl或者TObject。。。。。
 
1.//们都需要处理一个相同的事件例如Export
这个好像已经不是一个事件了.只能是一个功能,一个函数.
2.在你的分别实现的export中调用另外一个函数.或者一个类的类函数.这有些类似C++模版中的一些概念.
TA.Export//TFuncOp.Export(TA);
TB.Export//TFuncOp.Export(TB);
class procedure TFuncOp.Export(ObjectClass objClass);
 
TImpExport=class(IExport)
private
procedure Export;
end;

TA = class( TEdit , iExport )
private
FIExport:TImpExport;//or FIExport:iExport
public
// procedure export();这个函数不需要声明了,由下面一句代码的替代
property IExport:iExport read FIExport implements iExport;
end;
在TA的create函数里要构建一个FIExport:IExport实例。

TB 类似
 
同楼上的,来自帮助:

type
IMyInterface = interface
procedure P1;
procedure P2;
end;
TMyClass = class(TObject, IMyInterface)
FMyInterface: IMyInterface;
property MyInterface: IMyInterface read FMyInterface implements IMyInterface;
end;
var
MyClass: TMyClass;
MyInterface: IMyInterface;
begin
MyClass := TMyClass.Create;
MyClass.FMyInterface := ... // some object whose class implements IMyInterface ,这是关键

MyInterface := MyClass;
MyInterface.P1;
end;
 
这个看起来更清晰(有点不同于上例):
type
IMyInterface = interface
procedure P1;
procedure P2;
end;
TMyImplClass = class
procedure P1;
procedure P2;
end;
TMyClass = class(TInterfacedObject, IMyInterface)
FMyImplClass: TMyImplClass;
property MyImplClass: TMyImplClass read FMyImplClass implements IMyInterface;
procedure IMyInterface.P1 = MyP1;
procedure MyP1;

end;
procedure TMyImplClass.P1;
...
procedure TMyImplClass.P2;
...
procedure TMyClass.MyP1;
...
var
MyClass: TMyClass;
MyInterface: IMyInterface;
begin
MyClass := TMyClass.Create;
MyClass.FMyImplClass := TMyImplClass.Create;
MyInterface := MyClass;
MyInterface.P1
// calls TMyClass.MyP1;
MyInterface.P2
// calls TImplClass.P2;
end;
 
这个技术在系统设计中适当使用,有至关重要的意义
典型地,在不同界面的类继承体系中(比如两个界面继承树),实现同样(或类似)的后台逻辑处理
 
后退
顶部