Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]

инхеритед без ничего вызывает одноименный текущему методу.
инхеритед с чем-то вызывает конкретный метод предка.


Наверх

Титульная страница Поиск, карта сайта Написать письмо