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

2

为了让编译器保持冷静,你必须指定确切的返回类型,所以在你的情况下它必须是

IPictureInfo ,

所以你的代码看起来像:

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

编译器必须知道他在编译期间要处理的确切类型,以便能够构造语法树。想一想,可能还有其他 1000 种类型实现了相同的接口。

于 2013-11-10T20:59:05.073 回答
1

将您的财产视为两种方法(因为它就是这样):

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

所以这个接口告诉我们任何实现它的人都会有两个方法,一个返回一个IPictureInfo,一个接受一个I​​PictureInfo。那么,当您尝试以这种方式实现它时,您的情况会发生什么:

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

这里的问题是您实际上并没有正确实现接口,因为您的GroupInfo类将只接受IPictureInfo(特别是PictureInfo)的特定实现,而不是能够接受IPictureInfo(接口说它应该能够)的任何实现。

我不知道有任何简单的方法可以用一个属性来解决这个问题。你可以把它分成两个单独的方法,因为你可以像这样在类型上指定协方差/逆变:

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

这有几个缺点。首先,您没有一个统一的具体接口,这可能不是您想要的。

我不知道 C# 是否允许接口的协变实现,因为我几乎从不需要它(我认为不需要,但我不确定)。例如,即使您的界面是这样的:

public interface IGroupInfo
{
    IPictureInfo Picture { get; }
}

我不确定这会编译:

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

尽管这似乎是一件合理的事情。

编辑:刚刚检查过,最后一个示例无法编译,返回类型必须匹配。

于 2013-11-10T21:12:18.930 回答