Это вариант моего предыдущего вопроса о том, как скрыть унаследованные конструкторы. Как скрыть унаследованные методы:
Моделирование аналогично тому, как 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;
Но это не компилируется из-за неоднозначной перегрузки unparametered 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;
Но я думал, что все крутые ребята прячут свои предметы.
CreateInstance
и покончил с этим. - person The_Fox   schedule 21.01.2011foo
- этоCreate
, чего я не могу скрыть. - person Ian Boyd   schedule 24.01.2011