Форум: "Начинающим";
Текущий архив: 2011.09.11;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c