2

非常に単純な質問がありますが、以前にこの問題が発生したことはありません。

このコードを見てください:

interface IFoo
{
    IBar MyBar { get; }
}

interface IBar
{
    String Test { get; }
}

class Foo : IFoo
{
    public Bar MyBar { get; set; }
}

class Bar : IBar
{
    public String Test { get; set; }
}

問題は、Foo が IBar ではなく Bar を返すため、IFoo を実装していないことです。しかし、Bar は IBar を実装しているので問題はありません。私は何かが恋しいですか?

アプリケーションでクラス Foo を使用し、IFoo をソリューションの他の部分に公開したいと考えています。

これは回避策ですが、醜い解決策のようです:

class Foo : IFoo
{
    public Bar MyBar { get; set; }
    IBar IFoo.MyBar { 
        get { return this.MyBar; }
    }
}

これは進むべき道ですか、それともより良い方法ですか?

4

2 に答える 2

2

あなたはこれを行うことができます:

interface IFoo<out B> where B:IBar
{
    B MyBar { get; }
}

interface IBar
{
    String Test { get; }
}

class Foo : IFoo<Bar>
{
    public Bar MyBar { get; set; }
}

class Bar : IBar
{
    public String Test { get; set; }
}

これは、出力位置にある場合にのみ機能しBます (十分に長く考えれば明らかな理由から)。

于 2013-05-03T11:06:20.587 に答える
-1

問題は、Foo が IBar ではなく Bar を返すため、IFoo を実装していないことです。しかし、Bar は IBar を実装しているので問題はありません。私は何かが恋しいですか?

はい。IFoo インターフェイスのコントラクトを誤解しています。契約は簡単です:

ゲッターを持ち、戻り値の型が IBar である、MyBar という名前の 1 つのプロパティ。契約は、それが IBar 型のオブジェクトを返すということではなく、戻り値の型が IBar 型であるということです。

これは標準です。戻り値の型がICloneable1 つのメソッド を持つインターフェイスを実装してみてください。このインターフェイスを実装するということは、何があっても、戻り値の型が であるメソッドを実装する必要があることを意味します。もう少し具体的にしたい場合でも、他の戻り値の型は対象になりません。Clone()objectobject

あなたが提案した回避策は、Bar プロパティを返す IBar プロパティを持つ正しい方法の 1 つです。または、 IBar プロパティを取得して Bar インスタンスに設定することもできます。これは完全に有効であるため、IBar コントラクトを通じて IBar オブジェクトを操作します。それはデカップリングに役立ちます。

于 2013-05-03T12:59:11.867 に答える