gpt4 book ai didi

delphi - SW-设计 : Adapters for Class Hierarchy in Delphi (Generics vs. 沮丧)

转载 作者:行者123 更新时间:2023-12-03 15:01:37 24 4
gpt4 key购买 nike

我想针对以下问题提出一些建议:假设您要为 VCL 控件编写适配器。所有适配器应具有相同的基类,但在包装特殊控件方面有所不同(例如,从 TEdit 获取值与从 TSpinEdit 获取值不同)。所以第一个想法是创建一个类层次结构,例如

TAdapter = class
end;

TEditAdapter = class (TAdapter)
end;

TSpinEditAdapter = class (TAdapter)
end;

现在我想引入一个字段来保存对 vcl 控件的引用。在我的特殊适配器中,我当然希望使用具体的子类。但基类还应该包含一个引用(例如,如果我想使用适配器使控件可见)。

可能性 1(属性访问器中的向下转型):

TAdapter = class
protected
FCtrl : TControl;
end;

TEditAdapter = class (TAdapter)
public
property Control : TEdit read GetControl write Setcontrol;
end;
{...}
function TEditAdapter.GetControl : TEdit;
begin
Result := FCtrl as TEdit;
end;

因此,如果我实现一个特定的方法,我会使用 Control 属性,如果我在基类中执行某些操作,我会使用 protected 字段。

可能性 2(使用通用基类):

TAdapter = class
end;

TAdapter <T : TControl> = class (TAdapter)
protected
FCtrl : T;
end;

TEditAdapter = class (TAdapter <TEdit>)
end;

您更喜欢哪种解决方案?或者还有第三种解决方案,哪个更好?

亲切的问候,

基督教

最佳答案

你不能使用泛型来解决这个问题,因为你会遇到以下两种情况之一:

  • 您想要“适应”的属性或方法(例如 Text 属性)是在祖先类中定义的。在这种情况下,您不需要泛型,因为您可以为祖先使用一个适配器并解决所有后代的问题。
  • 属性或方法是由您要适配的类引入的。在这种情况下,您不能使用泛型,因为为了访问属性或方法,您需要该给定类型的泛型类型约束。例子。假设您想要 Text 的适配器TMyClass的属性(property)。让我们假设 TMyClass是介绍 Text 的人属性(property)。为了访问它,您需要将泛型类型声明为 TGeneric<T:TMyClass>这实际上并不通用。

在我看来,最好的选择是为每个类编写特定的适配器,就像您的第一个选择一样。您也许可以使用 RTTI 技巧来使您的第一个选项更容易实现,但我不确定这是否值得。

关于delphi - SW-设计 : Adapters for Class Hierarchy in Delphi (Generics vs. 沮丧),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6383819/

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