0

次のようなハンドル クラスがあるとします。

interface IHasHandle<TObject> {
     IHandle<TObject> Handle { get; }
}

interface IHandle<out TObject> {
     TObject Value { get; }
}

このクラスを使用して、階層内で最も派生した出力タイプを提供したいと考えています。私が今持っているものは次のようになります:

interface IAnimal : IHasHandle<IAnimal> { ... }

interface IMammal : IAnimal, IHasHandle<IMammal> { ... }

interface IFeline : IMammal, IHasHandle<IFeline> { ... }

class Tiger : IFeline {
     IHandle<IAnimal> IHasHandle<IAnimal>.Handle { get { ... } }
     IHandle<IMammal> IHasHandle<IMammal>.Handle { get { ... } }
     IHandle<IFeline> IHasHandle<IFeline>.Handle { get { ... } }
     public IHandle<Tiger>   Handle { get { ... } }
}

つまり、IAnimal を持っている場合は常に IHandle を取得でき、IMammal を持っている場合は IHandle を取得できます。

考えられるすべての実装を回避する方法について、この構造またはアイデアに関する一般的なコメントはありますか?

4

1 に答える 1

0

.NET 4.0 より前でも、次のようなことが可能でした。

interface IAnimal<TSpecies> : IHasHandle<TSpecies> where TSpecies : IAnimal<TSpecies> { ... }

interface IMammal<TSpecies> : IAnimal<TSpecies> where TSpecies : IMammal<TSpecies> { ... }

interface IFeline<TSpecies> : IMammal<TSpecies> where TSpecies : IFeline<TSpecies> { ... }

class Tiger : IFeline<Tiger> {
    IHandle<Tiger> IHasHandle<Tiger>.Handle { get { ... } }
}

もちろん、これによって の作成が妨げられることはありませんclass EvilCat : IFeline<Tiger>HandleTiger. IHasHandleまた、このコード サンプルでジェネリック パラメーターを1 つとして宣言すると、たとえばoutにキャストTiger( を実装IHasHandle<Tiger>)できるようになります。IHasHandle<IMammal>

于 2012-02-14T11:56:43.570 に答える