1

別のインターフェース内で使用されているインターフェースがありますが、問題はありません。ただし、親の実装は、子の実装がインターフェイスを持つことを除外しません。

public interface IGroupInfo
{
    IPictureInfo picture { get; set; }
}
public interface IPictureInfo {}

public class GroupInfo : IGroupInfo
{
    public PictureInfo picture { get; set; }
}

public class PictureInfo : IPictureInfo 
{ }

PictureInfo は IPictureInfo を実装しているため、これが機能しないのは奇妙に思えます。これに対する回避策はありますか、ここで何か間違っていますか?

生成された (部分的な) クラスにインターフェイスを配置しようとしていますが、(この例では) 'GroupInfo' クラスを変更できません。次回の生成時にコードが壊れてしまうからです。(これらは WSDL.EXE (Soapcalls) によって生成されるクラスです)

ありがとう、ユルジェン

4

2 に答える 2

1

プロパティを 2 つのメソッドと考えてください (それがそのためです)。

public interface IGroupInfo
{
    IPictureInfo GetPicture();
    void SetPicture( IPictureInfo value );
}

したがって、このインターフェイスは、それを実装する人は誰でも、IPictureInfo を返すメソッドと IPictureInfo を受け入れるメソッドの 2 つのメソッドを持つことを示しています。したがって、この方法で実装しようとすると、あなたの場合はどうなりますか:

public class GroupInfo : IGroupInfo
{
    public PictureInfo GetPicture();
    public void SetPicture( PictureInfo value );
}

ここでの問題は、実際にはインターフェイスを正しく実装していないことです。これは、GroupInfoクラスがIPictureInfo(具体的PictureInfoには) の実装を受け入れるのではなく、特定の実装のみを受け入れるためですIPictureInfo(インターフェイスができるはずだと言っている)。

単一のプロパティでこれを回避する簡単な方法を知りません。次のように型に対して共分散/反分散を指定できるため、2 つの別々の方法に分割できます。

public interface IGroupInfo<out TGet, in TSet> 
    where TGet : IPictureInfo
    where TSet : IPictureInfo
{
    TGet GetPicture();
    void SetPicture( TSet value );
}

これにはいくつかの欠点があります。まず、統一された具体的なインターフェイスが 1 つもありません。これは、必要なものではない可能性があります。

C# がインターフェイスの共変実装を許可するかどうかは、頭の中でわかりません。必要になることはほとんどないためです (必要だとは思いませんが、よくわかりません)。たとえば、インターフェースがこれだったとしても:

public interface IGroupInfo
{
    IPictureInfo Picture { get; }
}

これがコンパイルされるかどうかはわかりません:

public class GroupInfo : IGroupInfo
{
    public PictureInfo Picture { get; }
}

それは合理的なことのように思えますが。

編集:チェックしたところ、最後の例はコンパイルされません。戻り値の型が一致する必要があります。

于 2013-11-10T21:12:18.930 に答える