2012-02-08 15 views
4

こんにちは私は一般的なtreenodeを作ろうとしています。ここでは抽象ジェネリッククラスは継承されたGenericsコンストラクタC#

​​3210

であるそれは私がやろうとしているこれらの両方から継承されたコンパニオン・インタフェース

interface TreeNodeOperations<T> 
{ 
    //Adds child to tree node 
    public abstract void AddChild<T>(T child); 
    //Performs N-Tree search 
    public abstract TreeNode<T> SeachChild<T>(T child); 
} 

があります

public class FHXTreeNode<T>: TreeNode<T>, TreeNodeOperations<T> where T : ParserObject 
{ 
    public FHXTreeNode(FHXTreeNode<T> parent, T data) ---> # **ERROR** # 
    { 
     ParentNode = parent; 
     ObjectData = data; 
    } 

    //Adds child to tree node 
    public override FHXTreeNode<T> AddChild<ParserObject>(T childData) 
    { 
     FHXTreeNode<T> child = new FHXTreeNode<T>(this, childData); 

     //_childNodes.Add(child);   

     return child; 
    } 

} 

エラーは次のとおりです。 'Parser.Objects.TreeNode'には0個の引数を取るコンストラクタが含まれていません

Help Pls!

答えて

9

基本クラスのコンストラクタへの呼び出しを追加する必要があります。

その後、基本クラスのコンストラクタで処理されるため、FHXTreeNodeのコンストラクタ内でプロパティを設定する必要はありません。新しいコンストラクタは次のようになります。

public FHXTreeNode(FHXTreeNode<T> parent, T data) : base(parent, data) 
{ 
} 
+0

ありがとう。これは大きな助けになります! – Nizzy

+1

@JonathanVillegasあなたは答えを受け入れるべきです – phoog

3

あなたのFHXTreeNodeコンストラクタから基底クラスのコンストラクタを呼び出す必要があり:

public FHXTreeNode(FHXTreeNode<T> parent, T data) 
    : base(parent, data) 
{ 
    ParentNode = parent; 
    ObjectData = data; 
} 

はまた、慣例により、インタフェースはIは、.NETで大文字で始まりますTreeNodeOperationsはITreeNodeOperationsである必要があります

+0

+1 IConventionMention –

+0

ありがとう、誰かが既にそれにあなたを打ち負かす:) – Nizzy

5

基本クラスのコンストラクタを呼び出す必要があります。 :base(...)呼び出しを省略すると、基本クラスのパラメータのないコンストラクタが呼び出されます。基本クラスにこのようなコンストラクタがないため、エラーが発生します。彼らはすでに、基本クラスでに割り当てられますので、パラメータ化基底クラスのコンストラクタを呼び出す

public FHXTreeNode(FHXTreeNode<T> parent, T data) 
    :base(parent, data) 
{ 
} 

は、時代遅れすぎフィールドの初期化を行います。

C#ではコンストラクタを継承できません。新しいコンストラクターを、派生クラスに作成します。このコンストラクターは、基本クラスのコンストラクターと同じシグネチャーを持つことがあります。


あなたのインターフェイスは、あまりにも壊れている:あなたは、インターフェイスにpublic abstractなどのメソッドを宣言することはできません。インタフェースメソッドは常に暗黙のうちに公開され、決して実装を持たない。したがって、これらの修飾語は冗長であり、違法です。


次は、overrideインターフェイスメソッドできません。 ベースクラスからvirtual/abstractメソッドを上書きすることができます。あるインタフェースのメソッドにマッチするメソッドがある場合、そのメソッドを実装します。


さらに別の間違いは、あなたがインターフェイスのメソッドに型パラメータを再利用することです:void AddChild<T>(T child);は間違っています。この構文は、メソッドに型パラメーターを導入するためのものです。しかし、あなたは包含型から型パラメータを使いたいと思っています。したがって、あなたはAddChild(T child);と書くべきです。


はまた、いくつかの文体の問題があります:インターフェイス名はIで始めなければなりません。私は可能な限りフィールドprotectedを避けるだろう。

+0

あなたの入力をありがとう、実際に私がしたいのは、メソッドの型パラメータを導入することでしたインターフェイス名にはがあります。私は本当にあなたの提案に感謝します。 – Nizzy

+2

メソッドの型パラメータをインターフェイス型ではなく導入してもよろしいですか?これらのメソッドを汎用的にすることは意味がありません。 – CodesInChaos

+0

はい、私は例えばすべてのツリーが同じ方法で子を追加するわけではないことに気づいたので、これらのインタフェースが作られました。私が抽象基本クラスに配置する場合、私は、addChildメソッドをオーバーロードする必要があり、結果のコードは、今よりも悪いです。すべてのツリーが同じ方法で子を追加して検索するわけではないので、私はこれらのツリー操作を実装するために戦略パターンを適用することを考えていました。 – Nizzy

3

まず、publicabstractは、インタフェース宣言では有効なキーワードではありません。

public TreeNode() { } 

その後、FHXTreeNodeのインスタンスを呼び出すことなく作成することができません...:TreeNodeはそうのようなパラメータなしのコンストラクタを定義していないので、あなたの質問に答えるために

interface TreeNodeOperations<T> 
{ 
    //Adds child to tree node 
    void AddChild(T child); 
    //Performs N-Tree search 
    TreeNode<T> SeachChild(T child); 
} 

:あなたのインターフェイスは、次のようになります。次のような基本コンストラクタ:

public FHXTreeNode(FHXTreeNode<T> parent, T data) : base(parent, data) { }