以下に 2 つの単純なクラスを示します。最初はどちらもキーワード (virtual、overload、override、reintroduce) を持っていません。
TComputer = class(TObject)
public
constructor Create(Teapot: Integer);
end;
TCellPhone = class(TComputer)
public
constructor Create(Teapot: Integer; Handle: string);
end;
上記の定義を少し短いものとして表します。
TComputer = class(TObject)
constructor Create(Teapot: Integer);
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string);
また、構築時には、コンストラクター ( , )TCellPhone
が 1 つしかありません。これは、祖先コンストラクターが非表示になっているためです。i の可視コンストラクターを次のように示します。int
string
TCellPhone
- ティーポット: 整数; ハンドル:紐
ここで質問ですが、最初の 3 つのケースは理にかなっていますが、4 番目のケースは意味がありません。
1. 祖先コンストラクターは子孫によって隠されています。
TComputer = class(TObject)
constructor Create(Teapot: Integer);
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string);
Teapot: Integer; Handle: string
これは理にかなっています。新しいコンストラクターを宣言したため、祖先コンストラクターは非表示になっています。
2. 祖先の仮想コンストラクターは子孫によって隠されています。
TComputer = class(TObject)
constructor Create(Teapot: Integer); virtual;
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string);
Teapot: Integer; Handle: string
これは理にかなっています。新しいコンストラクターを宣言したため、祖先コンストラクターは非表示になっています。
注:先祖は仮想であるため、Delphi は、仮想先祖を非表示にしていることを警告します (前の静的コンストラクターを非表示にする例: 誰も気にしないので、警告はありません)。reintroduceを追加することで、警告を抑制することができます (「ええええええ、私は仮想コンストラクターを隠しています。そう するつもりでした」という意味です)。
TComputer = class(TObject) constructor Create(Teapot: Integer); virtual; TCellPhone = class(TComputer) constructor Create(Teapot: Integer; Handle: string); reintroduce;
3. オーバーロードのため、祖先コンストラクターが子孫に隠されていません:
TComputer = class(TObject)
constructor Create(Teapot: Integer);
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string); overload;
Teapot: Integer; Handle: string
Teapot: Integer
子孫コンストラクターは祖先のオーバーロードであるため、これは理にかなっています。そのため、両方を存在させることができます。祖先コンストラクターは隠されていません。
4. オーバーロードのため、仮想先祖コンストラクターが子孫に隠されていません -それでも警告が表示されます:
これは意味をなさないケースです:
TComputer = class(TObject)
constructor Create(Teapot: Integer); virtual;
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string); overload;
Teapot: Integer; Handle: string
Teapot: Integer
メソッド 'Create' は、基本型 'TComputer' の仮想メソッドを非表示にします
これはほとんど意味がありません。先祖が隠れていないだけでなく、子孫が過負荷になっています。文句を言うべきでもありません。
何を与える?