5
interface IAlpha
{
    IBeta BetaProperty { get; set; }
}

interface IBeta
{

}

class Alpha : IAlpha
{
    public Beta BetaProperty { get; set; } // error here
}

class Beta : IBeta
{

}

「InterfaceTest.Alpha」はインターフェイス メンバー「InterfaceTest.IAlpha.BetaProperty」を実装していません。「InterfaceTest.Alpha.BetaProperty」は「InterfaceTest.IAlpha.BetaProperty」を実装できません。「InterfaceTest.IBeta」の一致する戻り値の型がないためです。

私の質問は、プロパティの実装がまったく同じタイプに制限されている理由です。代わりに派生型を使用できないのはなぜですか?

4

2 に答える 2

11

まったく同じインターフェースを実装する必要があります。たとえば、これ有効である必要があります。

 IAlpha alpha = new Alpha();
 alpha.BetaProperty = new SomeOtherIBetaImplementation();

...しかし、それは常にそれが であることを期待するコードでは機能しませんBetaよね?

ただし、これにはジェネリックを使用できます。

interface IAlpha<TBeta> where TBeta : IBeta
{
    TBeta BetaProperty { get; set; }
}

...

public class Alpha : IAlpha<Beta>

もちろん、それはやり過ぎかもしれません -インターフェースとまったく同じように、タイプIBetainのプロパティを使用する方が良いかもしれません。Alphaそれは文脈に依存します。

于 2012-12-25T08:13:42.257 に答える
2

インターフェイスは、クラスが持つ一連のメソッドを宣言するため、そのインターフェイスを使用する人は誰でも何を期待すべきかを知っています。

そのため、そのインターフェイスを実装する場合は、正確なインターフェイスを実装する必要があります。これにより、他のすべてのユーザーが期待どおりの結果を得ることができます。

于 2012-12-25T08:11:40.133 に答える