2013-05-25 4 views
5

имеет простую иерархию объектов, как показано нижеДельфи перегрузки, переопределение, виртуальный метод

TLiveThing=class 
protected 
FTest:string; 
constructor Create(whereLive:string);overload;virtual; 
constructor Create(haveBone:Boolean);overload;virtual; 
end; 

THuman=class(TLiveThing) 
public 
constructor Create(whereLive:string);overload;override; 
constructor Create(age:integer);overload; 
end; 

в теоретически, если экземпляр THuman, у меня есть 2 конструктор, но на самом деле я 5 Конструктор отображается код понимания, на самом деле я хотят видеть 3 конструктора, - Create (whereLive: String), перекрываться - Создать (возраст: Integer) - Создать (haveBone: Integer)

human:=THuman.Create(  <=====in there I have 5 suggestion constructor 

почему у меня это странное поведение? как исправить это, потому что это так anoying, я не могу всегда проверить мой класс, что мне нужно создать экземпляр, и если я создаю экземпляр, как показано ниже

human:=THuman.Create(); <===== it doesnt give me error 

как я полностью скрыть свой anchestor конструктор? , Потому что если я instatiate, как и выше, полностью дать мне неправильный объект

UPDATE: а также я могу видеть по умолчанию Создать без параметра из TObject слишком

+0

У вас слишком много виртуальных конструкторов. У вас должен быть только один из них. –

+1

Вы уверены, что вам нужны виртуальные конструкторы? Вы когда-нибудь создавали экземпляр любого из этих классов, не зная тип во время компиляции? Если нет, то вам не нужны виртуальные конструкторы. –

+0

Трудно вам посоветовать здесь, потому что мы не знаем, что заставляет вас иметь так много перегруженных и виртуальных конструкторов. На первый взгляд пахнет вся ваша конструкция. Мои инстинкты в том, что исправление дизайна решит проблемы. Попытка скрыть конструкторов сродни тому, чтобы надеть нос для одежды. Дизайн все еще пахнет, вы просто не сможете его запах. –

ответ

1

не ставя акцент на вашей плохой реализации конструктора,

Ваша проблема заключается в том, что как предок, так и дочерний класс определены в одном блоке, поэтому стандартное определение Private/Protected здесь не применяется.

Если вы хотите, чтобы предотвратить конструктор предка (который вы переопределение в классе ребенка) от просмотра в качестве параметра кода при создании экземпляра объекта этого derrived класса, то просто сделать его членом строгого защищенного или строгий частный раздел.

С вашим примером:

TLiveThing=class 
strict protected 
constructor Create(whereLive:string); virtual; 
end; 

THuman=class(TLiveThing) 
public 
constructor Create(whereLive:string); overload; override; 
constructor Create(age:integer); overload; 
end; 

Это предотвратит конструктор предка Create(whereLive:string) от просмотра в качестве параметра при создании экземпляра вашего класса ребенка.

Как указал Дэвид, это не имеет никакого отношения к сокрытию конструктора Create по умолчанию, это только жизнеспособно для скрытия ваших пользовательских конструкторов.

+0

Это не поможет. Без параметров «TObject.Create» становится видимым благодаря внедрению перегруженного 'Create'. См. Дубликат. –

+0

Да, но он также сказал, что хочет скрыть конструктор предка Create (whereLive: string), и это, по крайней мере, поможет ему скрыть это. – Peter

+0

, так что это означает, что в delphi, если у меня есть 2 виртуальных конструктора в базовом классе, тогда производный класс имеет 1 конструктор и 1 переопределен из базы, тогда, когда я создаю экземпляр объекта из производного класса, у меня может быть 4 конструктора, включите переопределенный (Я получил этот опыт от моего кода по моему вопросу), что ошибка или просто так? (потому что я не получаю такого поведения на C#) – navirius

Смежные вопросы