我想对以下问题提出一些建议:假设您想为 VCL 控件编写适配器。所有适配器都应该具有相同的基类,但在包装特殊控件方面有所不同(例如,从 TEdit 获取值与从 TSpinEdit 获取值不同)。所以第一个想法是创建一个类层次结构
TAdapter = class
end;
TEditAdapter = class (TAdapter)
end;
TSpinEditAdapter = class (TAdapter)
end;
现在我想介绍一个字段来保存对 vcl 控件的引用。在我的特殊适配器中,我当然希望使用具体的子类。但是 Base 类也应该包含一个引用(例如,如果我想使用适配器使控件可见)。
可能性 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,如果我在我的基类中做某事,我将使用受保护的字段。
可能性 2(使用通用基类):
TAdapter = class
end;
TAdapter <T : TControl> = class (TAdapter)
protected
FCtrl : T;
end;
TEditAdapter = class (TAdapter <TEdit>)
end;
您更喜欢哪种解决方案?还是有第三种更好的解决方案?
亲切的问候,
基督教