2016-11-08 9 views
15

Tdictionaryから継承しようとしていて、何らかの理由でデフォルトの比較対象が失われています。これは私が本質的に何をすべきかです。このような構成によりDelphi Tdictionaryの継承

type 
    TinpVar = class 
    end; 
    TinputVars = class(Tdictionary<string,TinpVar>) 
    end; 
    TLVRvars = class(TinputVars) 
    constructor create; 
    end; 

constructor TLVRvars.create; 
begin 
    inherited; 
end; 

var LVRvars : TLVRvars; 

begin 
    LVRvars:=TLVRvars.create; 

LVRvarsにキー/値のペアを追加するとき、私はAVを取得します。結局私は、これは私がそれをしなければならない理由を私は理解していない

constructor TLVRvars.create; 
begin 
    inherited create; 
end; 

に継承クラスのコンストラクタを変更することで防ぐことができることを見出しました。私の問題は解決しましたが、私はまだ知りたいです。

+0

以前はコンストラクタがありましたか? – Dsm

答えて

20

inherited; 

はあなたのコンストラクタと同じパラメータリストを持つコンストラクタを呼び出します。コンストラクタにはパラメータがないため、inheritedTObjectのdo nothingコンストラクタを呼び出します。あなたはあなたの比較者を失っただけでなく、あなたのインスタンスは建設の残りの必要なステップを欠いています。あなたは

inherited Create; 

コンパイラと交換

代わりに、通常の方法で解決を実行します。これは、クラスの祖先リストを検索し、それができる最初のメソッドを呼び出します。その場合、次のようになります。

constructor Create(ACapacity: Integer = 0); overload; 

したがって、インスタンスが正しく作成されています。

ドキュメントはここにある:http://docwiki.embarcadero.com/RADStudio/en/Methods#Inherited

キーの抜粋は以下のとおりです。メンバーの名前が続いている

継承された場合、それは

通常のメソッド呼び出しを表します

継承された後に識別子がない場合は、 sを継承するメソッドと同じ名前の継承された メソッドに、または メソッドがメッセージハンドラの場合は、同じメッセージの継承されたメッセージハンドラに継承します。この場合、inheritedは明示的なパラメータである を取りませんが、 の囲みメソッドが呼び出されたのと同じパラメータを継承したメソッドに渡します。例えば:

inherited; 

は、コンストラクタの実装で頻繁に発生します。これは、 継承コンストラクタを、 子孫に渡されたパラメータと同じパラメータで呼び出します。

これはかなり奇妙ですね。それに直面して、さまざまなメソッドが呼び出されるのは驚くようです。しかし、重要な点は、平らなinheritedはパラメータリストの正確な一致につながるということです。あなたのメソッドにはパラメータはありません。

一方、inherited Createは標準的なメソッドコールです。後者の場合、そのパラメータのデフォルト値を使用して、1つのパラメータでメソッドを呼び出すことになります。だからあなたはパラメータのないコンストラクタを呼び出すように見えますが、あなたはそうではありません。 1つのパラメーター、ACapacity、および0の値を渡しています。

+2

デフォルトパラメータの危険性を強調しています。この場合、全く同じコードのように見えます: '継承された;'(終わる)デフォルトのパラメータのないctorを呼び出す**作成**対継承された作成; *明示的に継承されたパラメータのないctorを呼び出す* *実際には、* default *パラメータでctorに解決されます。良いキャッチ。 – Deltics

-2

コンパレータは、作成する必要があるオブジェクトです。降順クラスにコンストラクターがない場合は、継承されたコンストラクターを暗黙的に呼び出すため、既定のコンストラクターが作成されると思います。独自のコンストラクターを作成する場合は、継承されたCreateを呼び出す必要があります(私の意見では、先祖がその作業を実行できるようにする必要があります)。あなたのコンストラクタで

+2

これは私が恐れているマークの多少です –