![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Inherited
Очень злой © (2011-05-26 16:35:00)Чем отличается такой вызов перекрытого метода родительского класса
inherited Destroy;
от такого:
inherited;
?
если ничем, то откуда компилятор знает, какой параметр передавать в случае если вызов производится с параметром, например
inherited;
используется вместо:
inherited Create(AOwner);
?
Игорь Шевченко (2011-05-26 23:23:00) [1]
> Кода вы пишете обработчик message, то написав inherited;
> , вы вызовите не одноимённую функцию предка, а обработчик
> сообщения с таким же номером
весьма забавно
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFoo = class
private
procedure Bar(var Message: TMessage); message WM_DESTROY;
procedure Foo(var Message: TMessage); message WM_CREATE;
end;
TBar = class(TFoo)
private
procedure Foo(var Message: TMessage); message WM_DESTROY;
procedure Bar(var Message: TMessage); message WM_CREATE;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TFoo }
procedure TFoo.Bar(var Message: TMessage);
begin
ShowMessage('Foo.WMDestroy');
end;
procedure TFoo.Foo(var Message: TMessage);
begin
ShowMessage('Foo.WMCreate');
end;
{ TBar }
procedure TBar.Bar(var Message: TMessage);
begin
inherited;
ShowMessage('Bar.WMCreate');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Bar: TBar;
Message: TMessage;
begin
Bar := TBar.Create;
Message.Msg := WM_CREATE;
Bar.Dispatch(Message);
Message.Msg := WM_DESTROY;
Bar.Dispatch(Message);
Bar.Free;
end;
procedure TBar.Foo(var Message: TMessage);
begin
inherited;
ShowMessage('Bar.WMDestroy');
end;
end.
Ega23 (2011-05-26 20:05:00) [2]
> _Юрий (26.05.11 19:11) [6]
Если метод абстрактный, то нефиг вообще inherited писать.
Хотя вопрос скользкий: а вдруг иерархия измениться?
Палка о двух концах, короче.
_Юрий (2011-05-26 19:11:00) [3]И есть ещё ньюанс. Если метод предка абстрактный, то написав
inherited Имя метода
получим исключение, а просто
inherited- не получим
Anatoly Podgoretsky (2011-05-26 19:00:00) [4]> Очень злой (26.05.2011 16:35:00) [0]
Чего так и будешь огрызки показывать, вместо полного кода?
Ega23 (2011-05-26 17:11:00) [5]
> icWasya © (26.05.11 17:07) [3]
>
> Кода вы пишете обработчик message, то написав inherited;,
во! Спасибо что напомнил!
icWasya (2011-05-26 17:07:00) [6]И есть ещё ньюанс. Кода вы пишете обработчик message, то написав inherited;, вы вызовите не одноимённую функцию предка, а обработчик сообщения с таким же номером, то есть не нужно знать, как он называется и есть ли вообще.
Ega23 (2011-05-26 16:51:00) [7]
type
TClass1 = class (TObject)
public
constructor Create;
end;
TClass2 = class (TClass1)
public
constructor Create(Value: integer);
end;
constructor TClass1.Create;
begin
inherited; // можно и inherited Create; разницы нет
end;
constructor TClass2.Create(Value: Integer);
begin
inherited Create; // а вот тут уже на просто inherited; будет ошибка,
// ибо у предка в конструкторе нет параметра Value
end;
Медвежонок Пятачок (2011-05-26 16:40:00) [8]инхеритед без ничего вызывает одноименный текущему методу.
инхеритед с чем-то вызывает конкретный метод предка.