Это вариант на моем previous question on how to hide inherited constructors. Как скрыть наследуемые методы:Delphi: Как скрыть методы предков?
Моделирование после того, что 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;
Но это не компилируется из-за ambigious перегрузки 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;
Но я думал, что все крутые парни скрывают свои объекты.
Ну, вы просто не должны использовать Создать потому, что используется для конструкторов, и это не конструктор. –
>> Но я думал, что все классные дети скрывают свои объекты. << Нет, не в этом примере, по крайней мере. Все дети, которые считают, что это заставит их здорово попробовать, - но они не могут. Как только они узнают об этом, они WOSH! стать прохладным дети. – TheBlastOne
@ Давид Хеффернан Но Borland сделал это :( –