3

独自のインターフェースメンバーを持つインターフェースを実装する適切な方法は何ですか?(私はそれを正しく言っていますか?)これが私が意味することです:

public Interface IFoo
{
    string Forty { get; set; }
    string Two { get; set; }
}

public Interface IBar
{
    // other stuff...

    IFoo Answer { get; set; }
}

public class Foo : IFoo
{
    public string Forty { get; set; }
    public string Two { get; set; }
}

public class Bar : IBar
{
    // other stuff

    public Foo Answer { get; set; } //why doesnt' this work?
}

明示的なインターフェイスの実装を使用して問題を回避しましたが、もっと良い方法があるかどうか疑問に思っていますか?

4

4 に答える 4

6

インターフェイスとまったく同じタイプを使用する必要があります。

public class Bar : IBar 
{ 
    public IFoo Answer { get; set; }   
} 

注:IFooの代わりにFoo

その理由は、インターフェースがコントラクトを定義し、コントラクトがそれがである必要があると言っているためIFooです。

考えてみてください。

クラスがFooありFoo2、両方ともを実装しIFooます。契約に従って、両方のクラスのインスタンスを割り当てることができます。さて、あなたのコードが合法であるならば、あなたのクラスは。だけを受け入れるので、これはどういうわけか壊れますFoo。明示的なインターフェースの実装は、その事実を決して変えません。

于 2012-09-12T15:29:47.747 に答える
4

やりたいことができるようにするには、ジェネリックを使用する必要があります。

public interface IFoo
{
    string Forty { get; set; }
    string Two { get; set; }
}

public interface IBar<T>
    where T : IFoo
{
    // other stuff...

    T Answer { get; set; }
}

public class Foo : IFoo
{
    public string Forty { get; set; }
    public string Two { get; set; }
}

public class Bar : IBar<Foo>
{
    // other stuff

    public Foo Answer { get; set; }
}

これにより、「このインターフェイスを実装するには、を実装するタイプのパブリックゲッター/セッターを持つプロパティが必要です」などのインターフェイスを提供できますIFooIFooジェネリックスがなければ、クラスには、を実装するものではなく、正確に型のプロパティがあると言っているだけですIFoo

于 2012-09-12T15:35:54.663 に答える
0

IBarにはFooフィールドではなくIFooフィールドがあり、代わりに次のようにします。

public class Bar : IBar
{
    // other stuff

    public IFoo Answer { get; set; }
}
于 2012-09-12T15:30:39.083 に答える
0

FooはタイプIFooを拡張できますが、それはインターフェースが公開するものではありません。インターフェイスは契約を定義し、その契約の条件に従う必要があります。したがって、正しい方法は、 public IFoo Answer{get;set;}他の人が言っているように使用することです。

于 2012-09-12T15:32:45.460 に答える