Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.09.11;
Скачать: CL | DM;

Вниз

Inherited   Найти похожие ветки 

 
Очень злой   (2011-05-26 16:35) [0]

Чем отличается такой вызов перекрытого метода родительского класса

inherited Destroy;

от такого:

inherited;

?

если ничем, то откуда компилятор знает, какой параметр передавать в случае если вызов производится с параметром, например
inherited;
используется вместо:
inherited Create(AOwner);

?


 
Медвежонок Пятачок ©   (2011-05-26 16:40) [1]

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


 
Ega23 ©   (2011-05-26 16:51) [2]

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;


 
icWasya ©   (2011-05-26 17:07) [3]

И есть ещё ньюанс. Кода вы пишете обработчик message, то написав inherited;, вы вызовите не одноимённую функцию предка, а обработчик сообщения с таким же номером, то есть не нужно знать, как он называется и есть ли вообще.


 
Ega23 ©   (2011-05-26 17:11) [4]


> icWasya ©   (26.05.11 17:07) [3]
>
> Кода вы пишете обработчик message, то написав inherited;,


во! Спасибо что напомнил!


 
Anatoly Podgoretsky ©   (2011-05-26 19:00) [5]

> Очень злой  (26.05.2011 16:35:00)  [0]

Чего так и будешь огрызки показывать, вместо полного кода?


 
_Юрий   (2011-05-26 19:11) [6]

И есть ещё ньюанс. Если метод предка абстрактный, то написав
inherited Имя метода
получим исключение, а просто
inherited - не получим


 
Ega23 ©   (2011-05-26 20:05) [7]


> _Юрий   (26.05.11 19:11) [6]


Если метод абстрактный, то нефиг вообще inherited писать.
Хотя вопрос скользкий: а вдруг иерархия измениться?
Палка о двух концах, короче.


 
Игорь Шевченко ©   (2011-05-26 23:23) [8]


> Кода вы пишете обработчик 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.



Страницы: 1 вся ветка

Текущий архив: 2011.09.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.007 c
15-1305356058
RGV
2011-05-14 10:54
2011.09.11
Скорость отправки письма через почтовый клиент


15-1305890709
Тимохов Дмитрий
2011-05-20 15:25
2011.09.11
Вирт. машина Parallels - как отключить автомэп сетевых дисков?


15-1305963731
bss
2011-05-21 11:42
2011.09.11
Архив ТВ-программ


2-1306142943
vlgrig1961
2011-05-23 13:29
2011.09.11
Как передать переменную типа TextFile в виде параметра


15-1305643952
makvell
2011-05-17 18:52
2011.09.11
Меню форумов