![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Может ли конструктор быть виртуальным? [D7]
Ega23 © (2007-09-14 11:20:00)нашёл такое у Indy, конкретно - TformAbout = class(TForm)?
Т.е. что может быть - это понятно. Но зачем?
ANTPro (2007-09-16 22:39:00) [1]Очепятался я сорри %)
> [25] Инс © (15.09.07 00:54)
Это понятно.
> [27] oxffff © (15.09.07 11:24)
Это баг или сообщение действительно пустое?
jack128_ (2007-09-16 11:45:00) [2]
> Не могу понять
type
TControlClass = class of TControl;
procedure TForm1.Button1Click(Sender: TObject);
var
ControlClass: TControlClass;
begin
case IndexText(UpperCase(edControlName.Text), ['EDIT', 'MEMO', 'BUTTON']) of
0: ControlClass := TEdit;
1: ControlClass := TMemo;
2: ControlClass := TButton;
else
raise Exception.CreateFmt('Invalid control (%s)', [edControlName.Text]);
end;
// Если бы конструктор у TControl не был бы виртуальным,
// то всегда бы создовался экземпляр TControl со всеми вытекающими..
ControlClass.Create(Self).Parent := Self;
end;
Инс (2007-09-16 11:39:00) [3]
> Не могу понять зачем нужен виртуальный конструктор
См. [1],[16]
SKIPtr (2007-09-16 10:45:00) [4]Не могу понять зачем нужен виртуальный конструктор Виртуальным методом можно через предка запустить потомка Конструктор нельзя запускать через предка иначе создан будет предок
Или это уже не так
oxffff (2007-09-15 11:24:00) [5]
Kolan (2007-09-15 10:47:00) [6]> Инс © (15.09.07 00:54)
Я знаю что такое полиморфизм.
И без виртуальности будет работать.
Нет не будет если я забуду вызвать inherited, разница в том, что в случае с виртуальным методом компилятор выдасть соотв хинт(который убирается использованием reintroduce), а в случае с не вирт методом хинта не будет.
ЗЫ
Эта причина ([18] ) наверно первая с конца по важности
Инс (2007-09-15 00:54:00) [7]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 и снова. Теперь думаем, почему так получилось.
Плохиш (2007-09-15 00:51:00) [8]Даже "последнего наследника" :-)
Плохиш (2007-09-15 00:49:00) [9]
> virtual - возможность вызова метода родителя.
А в справке написано "наследника".
Anatoly Podgoretsky (2007-09-15 00:48:00) [10]> ANTPro (15.09.2007 00:34:20) [20]
virtual - кажется одно, вызывается другое.
Инс (2007-09-15 00:46:00) [11]
> virtual - возможность вызова метода родителя.
НЕТ! Я метод предка и статический вызвать могу. Фишка виртуальных методов в поздем связывании. Срочно читать учебник!
ANTPro (2007-09-15 00:34:00) [12]inherited - вызов метода родителя.
virtual - возможность вызова метода родителя.
Инс (2007-09-15 00:04:00) [13]
> Если не вызвать inherited и констр не виртуальный, то компилится
> все будет нормаль, ран тайм ошибок тоже, но работать не
> будет.
И без виртуальности будет работать.
Kolan (2007-09-15 00:03:00) [14]> Но зачем?
Как одну из причин я вижу такую:
Допустим в конструкторе предка выполняются действия без которых потомок работать не будет(Например создается список в котором будут содерзаться подключенные Обозреватели).
Если не вызвать inherited и констр не виртуальный, то компилится все будет нормаль, ран тайм ошибок тоже, но работать не будет.
А в случае с вирт конструктором будет хинт.
Это мое имхо.
Плохиш (2007-09-14 23:08:00) [15]
> > а как относится inherited к виртуальности?
>
> А может букварь почитать?
В моём букваре в описании inherited никаких виртуальностей не упоминается. Расскажите про свой букварь?
Инс (2007-09-14 16:38:00) [16]
> Ну например для создания объекта через классовую ссылку.
Я бы даже сказал более категорично: толькодля создание экземпляра через классовую ссылку. Других примеров не знаю.
evvcom (2007-09-14 15:21:00) [17]
> umbra © (14.09.07 12:28) [10]
Согласен, не содержит.
DiamondShark (2007-09-14 13:45:00) [18]
> Да уж. Как-то не ожидал, что и такое проскочит без hint-
> ов и message-й:
А чего бы ему не проскочить?
Везде статические методы.
Ega23 (2007-09-14 13:30:00) [19]
> Да уж. Как-то не ожидал, что и такое проскочит без hint-
> ов и message-й:
то-то и оно
Anatoly Podgoretsky (2007-09-14 12:51:00) [20]> ЮЮ (14.09.2007 12:47:11) [11]
Так inherited не имеет никакого отношение к виртуальности, более того виртуальность не имеет к этому совсем отношения. Будет вызван именно метод предка.