2017-01-23 9 views
0

私は私が私のような行動やTObjectを、継承することができinhertedキーワードを使用することができます知っているクラス記述する場合:Delphiのサブクラス継承

type 
TOperation = class(TObject) 
    constructor Create(dest, r1, r2: integer); 
end; 

そしてコンストラクタがinherited Create;を持つことになりますが。以下のクラスを見てください:

type 
TAddition = class(TOperation) 
    constructor Create(a1, a2: integer); 
end; 

TAdditionの最初の行は、それが、私はもちろんのTOperationの振る舞いを継承していますことを意味inherited Create;ある場合。しかし、これは私がTObjectの振る舞いも継承していることを意味しますか? (これはTOperationのスーパークラスです)。

私が父のクラスのコンストラクタ(TAdditionを見てください)のコンストラクタを継承するとき、私はその動作だけを継承していますか?

TOperation = class(TOBject) 
    private 
    dest, v1, v2: integer; 
    public 
    constructor Create(dest, r1, r2: integer); 
    property destination: integer read dest; 
    property value1: integer read v1; 
    property value2: integer read v2; 
end; 

TMemoria = class(TOperation) 
    private 
    dest, r1: integer; 
    public 
    constructor Create(dest, r1: integer); 
    property destination: integer read dest; 
    property register1: integer read r1; 
end; 

constructor TOperation.Create(dest, r1, r2: integer); 
begin 

    //inherit from TObject 
    inherited Create; 
    Self.r1 := r1; 
    Self.r2 := r2; //so on... 

end; 

constructor TMemoria.Create(dest, r1: integer); 
begin 

    //inherit from TObject OR inherit from TOperation? 
    inherited Create; 

end; 
+2

あなたははるかに明確にする必要があります。あなたのアウトラインでは、すべてではなく一部の行動ビットを継承します。親コンストラクタをバイパスし、TObjectコンストラクタにまっすぐ進みます。コードを記述すると混乱する。それを示す。 mcve。 –

+0

はい、作成者の実装を追加してください –

+0

私はシナリオを追加しました。私の質問は、基本的にサブクラスがTObjectまたは父のクラスから継承している場合です。 –

答えて

8
constructor TMemoria.Create(dest, r1: integer); 
begin 
    inherited Create; 
end; 

これはTObjectでパラメータなしのコンストラクタを呼び出し、即時の祖先で宣言されたコンストラクタを呼び出すことはありません。私は完全なコードはここにある父クラスから

を何も初期化していないです。パラメータが提供されていないので、それほど明確なはずです。詳細については

のドキュメントを参照してください:あなたは親クラスから継承されたコンストラクタを呼び出す逃してはならない、強力な指導原則としてhttp://docwiki.embarcadero.com/RADStudio/en/Methods_(Delphi)#Inherited

を。これは、親クラスで使用されているオブジェクトのインスタンス化に失敗することが多いことを意味します。私はその質問のコードを非常に疑わしいものと見なします。

+0

大丈夫、それは私が知る必要があったものです。たとえTMemoriaがサブクラスであっても、TObjectの作成から継承します。作成なしで何が起こるか? –

+0

それは、どちらがあなたが電話するかによって異なります。また、直前の祖先でパラメータのないコンストラクタを定義した場合は、それが呼び出されます。 –

+0

だから、もしTOperationがCreateだけのコンストラクタを持っていたら、TMemoriaはTOperationのコンストラクタを呼び出すでしょう(TObjectのコンストラクタではありません)? –

関連する問題