フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: inherited 単体と引数付きinherited
snail3
メンバー
投稿数: 39
inherited 単体と引数付きinherited
on: 2013/12/01 23:59 Sun

どこで聞くか迷ったんですが、inherited について教えて下さい。
他の人が作成したコンポーネントのソースを見ると

inherited と単体で書いてあるものと、例えば inherited Create;
などと継承元のメソッド名が書いてあるものがあります。

違いについて何か教えていただけませんか。

DEKO
管理者
投稿数: 2691
Re: inherited 単体と引数付きinherited
on: 2013/12/02 10:44 Mon

コンストラクタ Create 内に記述された inherited と inherited Create は厳密には違ったと思いますが、簡単に言えばこういう事です。

[inherited]
継承元の同名メソッドを同じパラメータで呼び出す。

[inherited メソッド名]
継承元 (親) の指定したメソッドを指定したパラメータで呼び出す。

See Also:

[inherited (DocWiki)]
http://docwiki.embarcadero.com/RADStudio/ja/%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89#inherited

[inherited (旧 Delphi 入門)]
http://kakinotane.s7.xrea.com/delphi/d2/t012.html

[inherited の使い方は? (Delphi Q&A)]
http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200603/200603_06030018.html

DEKO
管理者
投稿数: 2691
Re: inherited 単体と引数付きinherited
on: 2013/12/02 10:48 Mon

…何か答えになっていないような (^^;A
override されたメソッドで継承元の同名メソッドを呼び出して処理したいなら、普通は何も付けない inherited でいいような気がします。必ずメソッド名付きで処理しなければいけないような状況を端的に表したサンプルってないのでしょうかね?

procedure THoge.AAA;
begin
inherited BBB;
end;

 
このような (親の) 別名メソッドを呼び出す場合にメソッドを指定しなくてはならないのは当然ですしね…。

snail3
メンバー
投稿数: 39
Re: inherited 単体と引数付きinherited
on: 2013/12/02 13:40 Mon

読んでみましたが、よくわかりません。 (;_;)

サンプルのコンポーネントを2つ作ってみました。
TEditEx2はイベントが゛発生しないコード
TEditEx3はイベントが゛発生するコード
です。Changeイベント発生状態が変わってしまいます。

引数付きの inherited Changed ではイベント発生しません
引数なしの inherited ではイベント発生します

もう少し教えていただけないでしょうか。


//--------------------------------------------------
//----ソース1 イベントが゛発生しないコード
//--------------------------------------------------
unit EditEx2;

interface

uses
Windows, SysUtils, Classes, Math, Dialogs, FmtBcd, Forms,
Graphics, Controls, StdCtrls, Messages;

type
TEditEx2 = class( TEdit )
private
{省略}
protected
{ Protected 宣言 }
{省略}
// イベント
procedure Change; override;
// プロパティ設定用
public
{ Public 宣言 }
{省略}
published
{ Published 宣言 }
{省略}
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents ('samples', [TEditEx2]);
end;

procedure TEditEx2.Change;
begin
{省略}
// inherited; // ←イベント発生
inherited Changed; // ←イベント発生しない
end;

end.
//--------------------------------------------------
//----ソース2 イベントが゛発生するコード
//--------------------------------------------------
unit EditEx3;

interface

uses
Windows, SysUtils, Classes, Math, Dialogs, FmtBcd, Forms,
Graphics, Controls, StdCtrls, Messages;

type
TEditEx3 = class( TEdit )
private
{省略}
protected
{ Protected 宣言 }
{省略}
// イベント
procedure Change; override;
// プロパティ設定用
public
{ Public 宣言 }
{省略}
published
{ Published 宣言 }
{省略}
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents ('samples', [TEditEx3]);
end;

procedure TEditEx3.Change;
begin
{省略}
inherited; // ←イベント発生
// inherited Changed; // ←イベント発生しない
end;

end.

//--------------------------------------------------
//----2つのサンプルを使ったサンプル
//--------------------------------------------------
unit Unit4;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, EditEx2, EditEx3;

type
TForm4 = class(TForm)
EditEx31: TEditEx3;
EditEx21: TEditEx2;
Edit1: TEdit;
procedure EditEx31Change(Sender: TObject);
procedure EditEx21Change(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.EditEx21Change(Sender: TObject);
begin
// ↓イベントが発生しないので呼ばれない
Edit1.Text := 'Ex2 ' + Formatdatetime( 'nn:ss', Now );
end;

procedure TForm4.EditEx31Change(Sender: TObject);
begin
// ↓イベントが発生して呼ばれる
Edit1.Text := 'Ex3 ' + Formatdatetime( 'nn:ss', Now );
end;

end.

pik
メンバー
投稿数: 5
Re: inherited 単体と引数付きinherited
on: 2013/12/02 16:54 Mon

procedure TEditEx2.Change;
begin
{省略}
inherited; → Change; が呼ばれる
inherited Changed; → Changed; が呼ばれる
end;

単純に呼ばれるメソッドが違うだけなのでは……

DEKO
管理者
投稿数: 2691
Re: inherited 単体と引数付きinherited
on: 2013/12/02 17:06 Mon

これはですね、

inherited; // ←イベント発生

 
こちらだと、ご先祖の TCustomEdit.Change メソッドが実行されるのですが、

inherited Changed;  // ←イベント発生しない

 
こちらでは、ご先祖の TControl.Changed が実行されるのです。TEdit の OnChange イベントは TCustomEdit.Change の中で発生させているので、

inherited Change;  // ←Changed ではない

 
こちらならうまくいくと思います。今回の件は override したメソッドと同じメソッドではなく、直前の例に示したように、別のメソッドを呼び出しているだけのように思います。

DEKO
管理者
投稿数: 2691
Re: inherited 単体と引数付きinherited
on: 2013/12/02 17:08 Mon

ぐぬぬ…pik さんも書いていたのか。

snail3
メンバー
投稿数: 39
Re: inherited 単体と引数付きinherited
on: 2013/12/02 20:30 Mon

単純なタイプミスですね。 皆さんお手間をおかけして申し訳ありませんでした。 (^^;)

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.043 sec.