モナーの *やさしい* Delphi質問スレ Ver3
レス数が900を超えています。1000を超えると表示できなくなるよ。
0906DELモナ
NGNG例えば、以下のような2つのクラスがあったとします。
TParent = class
procedure Show;
end;
TChild = class( TParent )
procedure Show;
end;
上の宣言の意味はわかっているものとして話を進めます。
TChild は TPraent から派生しているので、当然親のメソッドである
Show も継承しているのですが、それを「上書き=再定義」していますね。
つまり、ここにある TChild.Show は、TParent.Show とは何の関係もありません。単に、「名前が同じである」だけです。
ここまでは良いですよね。ところで、クラスには
親クラスと、その派生クラスには代入互換性があります。
そこで、以下のコードを実行してみましょう。
var
P: TParnet;
C: TChild;
begin
C := TChild;
P := C;
P.Show;
end;
ここで、 P.Show で実行されるメソッドは、TParnet.Show と
TChild.Show のどちらなのか? P は元々 TParent として宣言されていますが、実際に P に入っているのは TChild のほうですよね。
結論から言うと、この場合は TParent.Show が実行されます。当然です。
なんせ、P.Show の P は TParent ですからね
では、TChild の宣言を次のように変えてみます。
TParnet = class
procedure Show; virtual;
end;
TChild = class( TParent )
procedure Show; override;
end;
これで、もういちど先ほどのコードを実行しましょう。すると、
P.Show で呼び出されるのは、TChild.Show になります。
つまり、Pに「実際に入っているクラスによって、動的に呼び出される
メソッドが変化する」のです。これが、動的メソッドです。
レス数が900を超えています。1000を超えると表示できなくなるよ。