Это вариант моего предыдущего вопроса о том, как скрыть унаследованные конструкторы . Как скрыть унаследованные методы:
Моделирование по тому, как 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;
Но я думал, что все классные дети прячут свои предметы.