gpt4 book ai didi

oop - delphi中的许多接口(interface)遗产

转载 作者:行者123 更新时间:2023-12-03 19:48:08 27 4
gpt4 key购买 nike

我希望继承一些 D 类遗产并实现接口(interface) A、B 和 C 的所有属性和方法。请帮我举一个 Delphi 中的示例。

我用德尔福 Xe7
一个类如何实现多个接口(interface)?
我正在尝试类似的东西:

Unit1
Type
IRefresher = Interface
['{B289720C-FFA4-4652-9F16-0826550DFCF9}']
procedure Refresh;
function getRefreshed: boolean;
property Refreshed:Boolean read getRefreshed;
End;
Unit2
Type
IRecorder = Interface
['{AB447097-C654-471A-A06A-C65CE5606721}']
procedure Reader;
procedure Writer;
end;
Unit3
ICustomer=Interface ['{F49C0018-37DA-463D-B5B4-4ED76416C7D4}']
procedure SetName(Value:String);
procedure SetDocument(Value:String);
function getName:String;
function getDocument:String;
End;
  Unit4
Uses Unit1,Unit2,Unit3;
TGovernmentCustomer = class(TInterfacedObject, ICustomer, IRecorder,
IRefresher)
a: String;
public
{$REGION 'Customer'}
procedure SetName(Value: String); override;
procedure SetDocument(Value: String);
function getName: String; override;
function getDocument: String; override;
{$ENDREGION}
{$REGION 'Recorder'}
procedure Reader; override;
procedure Writer; override;
{$ENDREGION}
{$REGION 'Refresher'}
procedure Refresh; override;
function getRefreshed: boolean; override;
{$ENDREGION}
End;

它不起作用,因为许多错误,例如“在基类中找不到刷新”,

最佳答案

为此,您至少有 3 个实现选项:

1) 虚拟和抽象方法。在这种情况下,您无法实例化此类,并且必须覆盖后代类中的抽象方法。这样的方法看起来像这样:

type
TGovernmentCustomer = class(TInterfacedObject, ICustomer, IRecorder, IRefresher)
a: String;
public
procedure SetName(Value: String); virtual; abstract;
end;

一旦方法是抽象的,就没有实现。

2)虚方法。在这种情况下,您可以实例化此类,并且可以覆盖后代类中的一些虚拟方法。这样的方法看起来像这样:
type
TGovernmentCustomer = class(TInterfacedObject, ICustomer, IRecorder, IRefresher)
a: String;
public
procedure SetName(Value: String); virtual;
end;

implementation

procedure TGovernmentCustomer.SetName(Value: String);
begin
// do something here. You can also leave it empty
end;

3) 静态方法。在这种情况下,您可以实例化此类,并且不能覆盖后代类中的静态方法。这样的方法看起来像这样:
type
TGovernmentCustomer = class(TInterfacedObject, ICustomer, IRecorder, IRefresher)
a: String;
public
procedure SetName(Value: String);
end;

implementation

procedure TGovernmentCustomer.SetName(Value: String);
begin
// do something here. This will be the behavior of all instances of this class and descendant classes if they exist
end;

最后一点:案例(3)的性能最好。在接口(interface)上调用虚拟方法会降低性能,这可能与您的特定应用程序相关,也可能不相关。

PS:正如 Stefan 所指出的,我对另一个 SO 问题的链接是错误的。但是,您可以从 Andreas Hausladen 博客中了解通过接口(interface)调用的虚拟方法的性能: http://andy.jgknet.de/blog/2016/05/whats-wrong-with-virtual-methods-called-through-an-interface/

关于oop - delphi中的许多接口(interface)遗产,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44123504/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com