3
public interface INestedInterfaceTest<TChildType>
    where TChildType : INestedInterfaceTest<TChildType>
{
     List<TChildType> children { get; set; }
}

public abstract class NestedInterfaceTest : INestedInterfaceTest<NestedInterfaceTest>
{
    public List<NestedInterfaceTest> children { get; set; }

    public TNestedInterface GetNestedInterface<TNestedInterface>()
        where TNestedInterface : NestedInterfaceTest, new()
    {
        return GateWay<TNestedInterface>.GetNestedInterface();
    }
}

public class GateWay<TNestedInterface>
    where TNestedInterface : class, INestedInterfaceTest<TNestedInterface>, new()
{
    public static TNestedInterface GetNestedInterface()
    {
        return new TNestedInterface();
    }
}

抽象クラスの GetNestedInterface メソッドで問題が発生します。エラー メッセージは次のとおりです。型 'TNestedInterface' は、ジェネリック クラス 'GateWay' でパラメーター 'TNestedInterface' として使用するには、'INestedInterfaceTest' に変換可能である必要があります

しかし...、私の抽象クラスNestedInterfaceTestはINestedInterfaceTestインターフェイスを実装しています。ここで何が欠けていますか?

以下は、再帰的なインターフェイスの実装なしで機能します。

public interface INestedInterfaceTest
{
}

public abstract class NestedInterfaceTest : INestedInterfaceTest
{
    public List<NestedInterfaceTest> children { get; set; }

    public TNestedInterface GetNestedInterface<TNestedInterface>()
        where TNestedInterface : NestedInterfaceTest, new()
    {
        return GateWay<TNestedInterface>.GetNestedInterface();
    }
}

public class GateWay<TNestedInterface>
    where TNestedInterface : class, INestedInterfaceTest, new()
{
    public static TNestedInterface GetNestedInterface()
    {
        return new TNestedInterface();
    }
}

再帰的な実装ではうまくいかないようです。

4

3 に答える 3

1

の一般的な制約がありませんGetNestedInterface<>()。これを次のように変更します。

public TNestedInterface GetNestedInterface<TNestedInterface>()
    where TNestedInterface : 
        NestedInterfaceTest, 
        INestedInterfaceTest<TNestedInterface>, // new
        new()
{
    return GateWay<TNestedInterface>.GetNestedInterface();
}

2 番目の制約が新しいことに注意してください。

于 2013-10-07T20:52:42.023 に答える
0

私は自分の問題を解決したと思います。コードを確認して、ご意見をお聞かせください:

public interface INestedInterfaceTest<TChildType>
    where TChildType : INestedInterfaceTest<TChildType>
{
    List<TChildType> children { get; set; }
}

public abstract class NestedInterfaceTest<TChildNestedInterface> : INestedInterfaceTest<TChildNestedInterface>
    where TChildNestedInterface : INestedInterfaceTest<TChildNestedInterface>
{
    public List<TChildNestedInterface> children { get; set; }

    public virtual TNestedInterface GetNestedInterface<TNestedInterface>()
        where TNestedInterface : NestedInterfaceTest<TChildNestedInterface>, INestedInterfaceTest<TNestedInterface>, new()
    {
        return GateWay<TNestedInterface>.GetNestedInterface();
    }
}

public class GateWay<TNestedInterface>
    where TNestedInterface : class, INestedInterfaceTest<TNestedInterface>, new()
{
    public static TNestedInterface GetNestedInterface()
    {
        List<TNestedInterface> nestedChildren = new List<TNestedInterface>();
        return new TNestedInterface
            {
                children = nestedChildren
            };
    }
}

public class NestedClass : NestedInterfaceTest<NestedClass>
{
    public NestedClass GetNestedClass()
    {
        return GetNestedInterface<NestedClass>();
    }
}

これで問題なく機能し、インターフェイスが「漏れる」のを防ぎます。

于 2013-10-07T21:33:33.547 に答える
0

NestedInterfaceTest実装し、実装する必要INestedInterfaceTest<NestedInterfaceTest>があるという要件がありTNestedInterfaceます。GetNestedInterfaceINestedInterfaceTest<TNestedInterface>

NestedInterfaceTestインターフェイスを再実装しないサブクラスを作成するとINestedInterfaceTest<>、その制約は満たされません。

//does not implement INestedInterfaceTest<Derived>
class Derived : NestedInterfaceTest {}
class Derived2 : NestedInterfaceTest {}

Derived d = new Derived();
// breaks because GateWay<Derived2> cannot be constructed
d.GetNestedInterface<Derived2>();

私が見る最も簡単な回避策は、オブジェクトモデルに適合しない可能性があるため、GateWayクラスの制約を次のように再定義することです。

public class GateWay<TNestedInterface>
  where TNestedInterface : class, INestedInterfaceTest<NestedInterfaceTest>, new()

このように、NestedInterfaceTest を継承するすべてのクラスは、インターフェイスを再実装する必要なく制約を満たします。NestedInterfaceTest がそれを満たしているからです。次のようにするとさらに便利です。

public class GateWay<TNestedInterface>
  where TNestedInterface : class, NestedInterfaceTest, new()

とにかく、これを機能させることができたとしても、クラスの消費者と (最終的な) メンテナーの両方にとって、依然として混乱を招きます。また、いくつかの誤用が不可能であると確信することはほとんどできません

于 2013-10-07T20:58:54.980 に答える