私は理解しようとしています
- バーチャル
- オーバーライド
- 過負荷
- 再導入
オブジェクトコンストラクターに適用された場合。コンパイラがシャットダウンするまで、ランダムにキーワードを追加するたびに(Delphiで12年間開発した後)、ランダムに試すのではなく、自分が何をしているのかを知りたいと思います。
架空のオブジェクトのセットが与えられた場合:
TComputer = class(TObject)
public
constructor Create(Cup: Integer); virtual;
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string); virtual;
end;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); override;
constructor Create(Cup: Integer; Teapot: string); override;
end;
私が彼らに振る舞わせたい方法はおそらく宣言から明らかですが:
TComputer
単純なコンストラクターがあり、子孫はそれをオーバーライドできますTCellPhone
代替コンストラクターがあり、子孫はそれをオーバーライドできますTiPhone
両方のコンストラクターをオーバーライドし、それぞれの継承バージョンを呼び出します
これで、そのコードはコンパイルされません。なぜうまくいかないのか理解したい。また、コンストラクターをオーバーライドする適切な方法を理解したいと思います。または、コンストラクターをオーバーライドすることはできませんか?それとも、コンストラクターをオーバーライドすることは完全に受け入れられますか?おそらく、複数のコンストラクターを持つべきではありません。おそらく、複数のコンストラクターを持つことは完全に許容されます。
理由を理解したい。そうすれば、それを修正することは明らかです。
も参照してください
編集:私はまた、、、、の順序でいくつかの推論を得ることを探してvirtual
います。キーワードのすべての組み合わせを試すと、組み合わせの数が爆発的に増えるためです。override
overload
reintroduce
- バーチャル; 過負荷;
- バーチャル; オーバーライド;
- オーバーライド; 過負荷;
- オーバーライド; バーチャル;
- バーチャル; オーバーライド; 過負荷;
- バーチャル; 過負荷; オーバーライド;
- 過負荷; バーチャル; オーバーライド;
- オーバーライド; バーチャル; 過負荷;
- オーバーライド; 過負荷; バーチャル;
- 過負荷; オーバーライド; バーチャル;
- 等
編集2: 「オブジェクト階層は可能ですか? 」から始めるべきだと思います。そうでない場合は、なぜですか?たとえば、祖先からコンストラクターを持つことは根本的に間違っていますか?
TComputer = class(TObject)
public
constructor Create(Cup: Integer); virtual;
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string); virtual;
end;
TCellPhone
今では2つのコンストラクターがあると思います。しかし、Delphiでキーワードの組み合わせを見つけて、それが有効なことだと思わせることができません。私はここに2つのコンストラクターを持つことができると考えるのは根本的に間違っていTCellPhone
ますか?
注:この線より下のすべてが質問に答えるために厳密に必要なわけではありませんが、それは私の考えを説明するのに役立ちます。おそらく、私の思考プロセスに基づいて、すべてを明確にするために私が欠けている基本的な部分を見ることができます。
現在、これらの宣言はコンパイルされません。
//Method Create hides virtual method of base type TComputer:
TCellPhone = class(TComputer)
constructor Create(Cup: Integer; Teapot: string); virtual;
//Method Create hides virtual method of base type TCellPhone:
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); override;
constructor Create(Cup: Integer; Teapot: string); overload; <--------
end;
だから最初に私は修正しようとしますTCellPhone
。キーワードをランダムに追加することから始めます(それは私が望まない他のコンストラクターを隠すので、overload
私は望まないことを知っています):reintroduce
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string); virtual; overload;
end;
しかし、それは失敗します:Field definition not allowed after methods or properties
。
メソッドまたはプロパティの後にフィールドがない場合でも、キーワードvirtual
とoverload
キーワードの順序を逆にすると、Delphiがシャットダウンすることを経験から知っています。
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
しかし、それでもエラーが発生します。
メソッド「作成」は、基本タイプ「TComputer」の仮想メソッドを非表示にします
だから私は両方のキーワードを削除してみます:
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string);
end;
しかし、それでもエラーが発生します。
メソッド「作成」は、基本タイプ「TComputer」の仮想メソッドを非表示にします
だから私は今試してみることに自分自身を辞任しますreintroduce
:
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string); reintroduce;
end;
そして今、TCellPhoneはコンパイルされますが、それはTiPhoneにとって事態をさらに悪化させました。
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); override; <-----cannot override a static method
constructor Create(Cup: Integer; Teapot: string); override; <-----cannot override a static method
end;
どちらもオーバーライドできないと不平を言っているので、override
キーワードを削除します。
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer);
constructor Create(Cup: Integer; Teapot: string);
end;
しかし、2番目の作成では、オーバーロードでマークする必要があると言っています。これは、オーバーロードとしてマークする必要があります(実際、オーバーロードとしてマークするのは、そうでない場合に何が起こるかを知っているためです)。
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); overload;
constructor Create(Cup: Integer; Teapot: string); overload;
end;
このセクションではすべてが良好interface
です。残念ながら、私の実装は機能しません。TiPhoneの単一パラメーターコンストラクターは、継承されたコンストラクターを呼び出すことができません。
constructor TiPhone.Create(Cup: Integer);
begin
inherited Create(Cup); <---- Not enough actual parameters
end;