7

これは私がやりたいことです:

Interface IMyInterface
{
    List<IMyInterface> GetAll(string whatever)
}

これを実装するクラスには、独自の型のリストを返す関数が必要です。これは可能ですか?技術的には、これを実装するクラスは、これを実装する他のクラスのリストを返す可能性があり、必ずしも同じクラスではないことを知っていますが、理想的ではありませんが、それを受け入れることができます。

これを試しましたが、実装クラスにメソッドを正しく実装させることができません。

4

4 に答える 4

13

このインターフェースの実装は簡単です:

public class MyInterfaceImpl : IMyInterface
{
    public List<IMyInterface> GetAll(string whatever)
    {
        return new List<IMyInterface> { new MyInterfaceImpl(), this };
    }
}

メソッドのシグネチャはまったく同じである必要があることに注意してください。つまり、戻り値の型は である必要がList<IMyInterface>ありList<MyInterfaceImpl>ます。

リスト内の型をインターフェイスを実装するクラスと同じ型にしたい場合は、ジェネリックを使用する必要があります。

public interface IMyInterface<T> where T : IMyInterface<T>
{
    List<T> GetAll(string whatever)
}

public class MyInterfaceImpl : IMyInterface<MyInterfaceImpl>
{
    public List<MyInterfaceImpl> GetAll(string whatever)
    {
        return new List<MyInterfaceImpl > { new MyInterfaceImpl(), this };
    }
}
于 2013-06-05T09:18:56.830 に答える
2

これは通常の解決策です。インターフェイスIPersonがあり、人の各親にアクセスしたいとします。したがって、次のようにインターフェイスを宣言するのが合理的です。

interface IPerson
{
    IList<IPerson> GetAllParents();
}

これで、その親の親を取得し、次に親を取得できるようになりました... アイデアが得られたことを願っています。このような設計は、単純な静的モデルを使用して深い動的構造をモデル化できるため、非常に柔軟です。

実装は非常に簡単です。

class Person : IPerson
{
    IList<IPerson> parents;

    public Person(IList<IPerson> parents)
    {
        this.parents = parents;
    }

    public IList<IPerson> GetAllParents()
    {
        return parents;
    }
}

ある意味では、親のない人物 (ある種のアダムとイブ) を作成し、親への参照を保持して子を追加する必要があります。ご覧のとおり、私の素朴なモデルは、非常に単純なインターフェイスを外部に公開しながら、ランダムに深い家族構造を処理できます。

于 2013-06-05T09:19:51.310 に答える
1

インターフェイスが自分自身を参照できなかった理由がわかりません-以下では問題ありません。

interface ITest
{
    List<ITest> GetAll(string whatever);
}

class MyClass : ITest
{
    public List<ITest> GetAll(string whatever)
    {
        return new List<ITest>();
    }
}
于 2013-06-05T09:20:47.690 に答える