【发布时间】:2011-01-20 16:37:50
【问题描述】:
这是我的previous question on how to hide inherited constructors 的变体。如何隐藏继承的方法:
仿照 Delphi 让您构造 COM 对象的方式:
CoDOMDocument = class
class function Create: IXMLDOMDocument2;
end;
我有一个工厂,它创建一个实现接口的对象:
CoCondition = class
public
class function Create: ICondition;
end;
这很好用。它工作正常,即使祖先中有一个名为Create 的方法。它有效,因为我没有 overload 关键字存在。一旦我添加了overload 关键字:Delphi 将允许继承的Create 方法“闪耀”:
CoCondition = class
public
class function Create: ICondition; overload;
end;
所以现在CoCondition 有两个可用的Create 方法:
class function CoCondition.Create: ICondition;
constructor TObject.Create;
你想打电话给哪个是模棱两可的。很明显,解决方法是不使用 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;
由于我有 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;
我只希望我的四个重载存在,没有其他。即我想隐藏任何祖先方法。
如何隐藏祖先方法?
我也尝试过明确声明祖先方法,但将其置于受保护状态,因此没有人可以使用它:
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;
但由于未参数 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;
但是拒绝了。
我可以只公开实现该对象的对象:
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;
但我认为所有酷孩子都会隐藏他们的物品。
【问题讨论】:
-
好吧,你不应该使用 Create,因为它用于构造函数,而这不是构造函数。
-
>>但我认为所有酷孩子都会隐藏他们的物品。
-
@David Heffernan 但 Borland 做到了 :(
-
@Ian 当然,您从 Embarcadero 引用的代码可能是由 typelib 导入器生成的。无论如何,他们并没有试图超载。无论如何,我认为 Create 应该保留给构造函数。
-
我将这些方法命名为
CreateInstance并完成它。
标签: delphi inheritance factory factory-pattern