Чи може конструктор бути віртуальним
знайшов таке у Indy, саме - TformAbout = class(TForm)? Тобто. що можливо - це зрозуміло. Але навіщо?
Ну, наприклад, для створення об'єкта через класове посилання.
а хіба вони не всі віртуальні починаючи з TComponent?
> знайшов таке у Indy,Дивно, чому не в Classes?
TComponent = class(TPersistent, IInterface, IInterfaceComponentReference) . public constructor Create(AOwner: TComponent); virtual;
А чому тоді у нащадків TComponent конструкторам override не ставлять?
так ставлять, начебто, коли перекривають.
> чому тоді у нащадків TComponent конструкторам override > не ставлять?
> А чому тоді у нащадків TComponent конструкторам override > не ставлять?
А те, що, не ставлячи override, що повсюдно використовують вherited, не бентежить? :)
> А те, що, не ставлячи override, щосили використовують inherited, > Чи не бентежить?а як ставиться доповноваженого до віртуальності?
> а як ставиться доповноваженого до віртуальності?А може буквар почитати?
> А може буквар почитати?а може я вже почитав? Ви хочете сказати, що нижченаведений код збереже помилку?
TMyObject = class public constructor Create; end;
< . > constructor TMyObject.Create; begin inherited; end;
Що ж. Якось не очікував, що й таке проскочить без hint-ів та message-й:
type TMyObject = class(TObject) public функція ClassType: TClass; end;
function TMyObject.ClassType: TClass; begin Result := inherited ClassType; end;
Тобто. можна обійтися без будь-яких virtual і dynamic?
Так inherited не має ніякого відношення довіртуальності, навіть віртуальність немає до цього зовсім відношення. Буде викликано саме метод предка.
> Що ж. Якось не очікував, що й таке проскочить без hint-> ов та message-й:
> Що ж. Якось не очікував, що й таке проскочить без hint-> ов і message-й:А чого б йому не проскочити? Скрізь статичні методи.
> Ну, наприклад, для створення об'єкта через класове посилання.
> > а як належить inherited до віртуальності? > > А чи може буквар почитати?У моєму букварі в описі вherited ніяких віртуальностей не згадується. Розкажіть про свій буквар?
> Але навіщо?Як одну з причин я бачу таку: Допустимо в конструкторі предка виконуються дії без яких нащадок працювати не буде(Наприклад, створюється список в якому будуть міститися підключені Оглядачі).
Якщо не викликати inherited і констр не віртуальний, то компілі все буде нормаль, ран тайм помилок теж, але працювати не буде.
А у випадку з віртом конструктором буде хінт.
> Якщо не викликати inherited і констр не віртуальний, то компіліться > все буде нормаль, ран тайм помилок теж, але не працювати > буде.І без віртуальності працюватиме.
inherited - виклик методу батька. virtual - можливість виклику методу батька.
virtual – здається одне, викликається інше.
> virtual - можливість виклику методу батька.А у довідці написано "спадкоємця".
Навіть "останнього спадкоємця" :-)
evvcom, Kolan, ANTPro - інформація про роздуми:
TA = class public procedure Proc1; virtual; procedure Proc2; end;
TB = class(TA) public procedure Proc1; override; end;
procedure TA.Proc1; begin ShowMessage("A"); end;
procedure TA.Proc2; begin Proc1; end;
procedure TB.Proc1; begin ShowMessage("B"); end;
Створюємо екземпляр TB і викликаємо метод Proc2. А тепер прибираємо virtual та override і знову. Тепер думаємо чому так вийшло.
І без віртуальності буде працювати.Не буде якщо я забуду викликати inherited, різниця в тому, що у випадку з віртуальним методом компілятор видасть соотв хінт(який забирається використанням reintroduce), а у випадку з не вірт методом хінту не буде.
ЗИ Ця причина ([18]) напевно перша з кінця за важливістю.
Не можу зрозуміти навіщо потрібний віртуальний конструктор Віртуальним методом можна через предка запустити нащадка Конструктор не можна запускати через предка інакше створено буде предок Або це вже не так
> Не можу зрозуміти навіщо потрібний віртуальний конструкторДив. [1],[16]
> Не можу зрозумітиtype TControl >procedure TForm1.Button1Click(Sender: TObject); var ControlClass: TControlClass; begin case IndexText( UpperCase(edControlName.Text), ["EDIT", "MEMO", "BUTTON"]) of 0: Control > 1: Control > 2: Control > else raise Exception.CreateFmt("Invalid control (%s)", [edControlName.Text]); end; // Якби конструктор у TControl не був би віртуальним, // то завжди б створювався екземпляр TControl з усіма витікаючими.. Control >end;
Зачепився я соррі %)