Ian*_*oyd 0 delphi inheritance factory factory-pattern
这是我之前关于如何隐藏继承的构造函数的问题的变体.你如何隐藏继承的方法:
在Delphi允许您构造COM对象的方式之后进行建模:
CoDOMDocument = class
class function Create: IXMLDOMDocument2;
end;
Run Code Online (Sandbox Code Playgroud)
我有一个工厂,创建一个实现接口的对象:
CoCondition = class
public
class function Create: ICondition;
end;
Run Code Online (Sandbox Code Playgroud)
这很好用.虽然在祖先中有一种叫做方法,但它工作正常Create.它的工作原理是因为我没有overload关键字存在.只要我添加overload关键字:Delphi将允许继承的Create方法"闪耀":
CoCondition = class
public
class function Create: ICondition; overload;
end;
Run Code Online (Sandbox Code Playgroud)
所以现在CoCondition有两种Create方法可用:
class function CoCondition.Create: ICondition;
constructor TObject.Create;
Run Code Online (Sandbox Code Playgroud)
你要打电话给哪一个是模棱两可的.修复,显然是没有overload关键字(为什么你,你没有重载任何东西?).好吧,事实证明我正在超载的东西:
CoCondition = class
public
class function Create: ICondition; overload;
class function Create(const ConditionType: TConditionType): ICondition; overload;
class function Create(const PropertyName: string; const Operation: TConditionOperation; const Value: Variant): ICondition; overload;
class function Create(const ConditionType: TConditionType; const SubConditions: IInterfaceList): ICondition; overload;
end;
Run Code Online (Sandbox Code Playgroud)
由于我有overload关键字,因此该类有五个重载,而不仅仅是我想要的四个:
class function CoCondition.Create: ICondition;
class function CoCondition.Create(const ConditionType: TConditionType): ICondition; overload;
class function CoCondition.Create(const PropertyName: string; const Operation: TConditionOperation; const Value: Variant): ICondition; overload;
class function CoCondition.Create(const ConditionType: TConditionType; const SubConditions: IInterfaceList): ICondition; overload;
constructor TObject.Create;
Run Code Online (Sandbox Code Playgroud)
我只希望我的四个重载存在,而不是其他.即我想隐藏任何祖先方法.
我如何隐藏祖先方法?
我也尝试明确地声明祖先方法,但让它受到保护,所以没有人可以得到它:
CoCondition = class
protected
constructor Create; overload;
public
class function Create(): ICondition; overload;
class function Create(const ConditionType: TConditionType): ICondition; overload;
class function Create(const PropertyName: string; const Operation: TConditionOperation; const Value: Variant): ICondition; overload; //leaf
class function Create(const ConditionType: TConditionType; const SubConditions: IInterfaceList): ICondition; overload; //AND/OR/NOT children
end;
Run Code Online (Sandbox Code Playgroud)
但由于未反对的过度重叠,这无法编译Create().
我还考虑过:
CoCondition = class
public
class function Make(): ICondition; overload;
class function Make(const ConditionType: TConditionType): ICondition; overload;
class function Make(const PropertyName: string; const Operation: TConditionOperation; const Value: Variant): ICondition; overload; //leaf
class function Make(const ConditionType: TConditionType; const SubConditions: IInterfaceList): ICondition; overload; //AND/OR/NOT children
end;
Run Code Online (Sandbox Code Playgroud)
但拒绝了它.
我可以只暴露实现该对象的对象:
TCondition = class(TInterfacedObject, ICondition)
...
public
constructor Create; overload;
constructor Create(const ConditionType: TConditionType); overload;
constructor Create(const PropertyName: string; const Operation: TConditionOperation; const Value: Variant); overload; //leaf
constructor Create(const ConditionType: TConditionType; const SubConditions: IInterfaceList); overload; //AND/OR/NOT children
end;
Run Code Online (Sandbox Code Playgroud)
但我认为所有酷孩子都隐藏了他们的物品.
隐藏方法是不可能的,因为它违背了面向对象编程的基础.
即使一种语言支持隐藏,你也可以随时解决它.
例如,如果您TAnimal使用Name属性创建一个类,然后创建一个 TNamelessAnimal要隐藏该Name属性的类.
现在,您可以将TNamelessAnimal实例强制转换为TAnimal引用,并仍然可以访问该Name属性.
这是完全合乎逻辑的,因为a TNamelessAnimal是a TAnimal,因此具有Name属性.
--jeroen
Delphi 不支持隐藏方法,因为它不符合逻辑。假设祖先 TAncestor 有公共方法 AMethod。现在声明 TDescendant=class(TAncestor) 并让它覆盖 AMethod 作为受保护的。现在,用户可以简单地将 TDescendant 转换为 TAncestor 并访问本应隐藏的方法。我不知道是否有任何面向对象的语言支持在祖先中隐藏方法,但我怀疑是否有。