C#Parent子接口

时间:2013-11-10 20:56:13

标签: c# interface

我在另一个界面中使用了一个接口,没问题。但是,除了具有接口的子实现之外,父实现不会。

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)生成的类)

感谢, Jurjen

2 个答案:

答案 0 :(得分:2)

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

IPictureInfo ,

所以你的代码看起来像是:

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

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

答案 1 :(得分:1)

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

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

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

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; }
}

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

编辑:刚检查过,最后一个例子不会编译,返回类型必须匹配。

相关问题