SW-Design:Delphi中的类层次结构适配器(泛型与下行)

SW-Design:Delphi中的类层次结构适配器(泛型与下行),第1张

概述我想对以下问题提出一些建议: 假设你想为VCL控件编写适配器.所有适配器应具有相同的基类,但在包装特殊控件方面有所不同(例如,从TEdit获取值与从TSpinEdit获取值不同). 所以第一个想法就是创建一个类层次结构 TAdapter = classend;TEditAdapter = class (TAdapter)end;TSpinEditAdapter = class (TAd 我想对以下问题提出一些建议:
假设你想为VCL控件编写适配器.所有适配器应具有相同的基类,但在包装特殊控件方面有所不同(例如,从TEdit获取值与从TSpinEdit获取值不同).
所以第一个想法就是创建一个类层次结构

TAdapter = classend;TEditAdapter = class (TAdapter)end;TSpinEditAdapter = class (TAdapter)end;

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

可能性1(物业存取中的向下):

TAdapter = classprotected  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 = classend;TAdapter <T : TControl> = class (TAdapter)protected  FCtrl : T;end;TEditAdapter = class (TAdapter <TEdit>)end;

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

亲切的问候,

基督教

解决方法 您不能使用泛型来解决此问题,因为您将处于以下两种情况之一:

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

在我看来,最好的办法是为每个类编写特定的适配器,如第一个选项.您可以使用RTTI技巧使您的第一个选项更容易实现,但我不确定它是否值得.

总结

以上是内存溢出为你收集整理的SW-Design:Delphi中的类层次结构适配器(泛型与下行)全部内容,希望文章能够帮你解决SW-Design:Delphi中的类层次结构适配器(泛型与下行)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1272954.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存