1

该示例如下所示:

interface IA
{
    ICollection<IB> Bs {get;set;}
}

interface IB
{
}


public class BBase : IB
{

}

public class ABase : IA
{
    public ICollection<BBase> Bs { get; set; }
}

问题是,当我想用​​ 实现接口IABBase,就像我在 中所做的那样ABase,发生了错误。那是说我只能使用IB而不是BBase实现IAinABase吗?

4

2 回答 2

7

你需要做的是IA通用的:

interface IA<T> where T : IB
{
    ICollection<T> Bs { get; set; }
}

interface IB
{
}


public class BBase : IB
{

}

public class ABase : IA<BBase>
{
    public ICollection<BBase> Bs { get; set; }
}

接口的实现应该与它的定义完全匹配,因此在非泛型情况下,您应该完全符合ICollection<IB> Bs {get;set;}ABase即它可以接受任何IB实现。

而当接口是通用的(interface IA<T> where T : IB)时,它的实现应该提供任何T满足给定约束的东西(即这里的一些精确实现IB)。因此ABase类也变得通用。

欲了解更多信息,请阅读:

  1. 通用接口(C# 编程指南)
  2. where(泛型类型约束)(C# 参考)
于 2013-02-28T07:03:22.267 回答
2

您不能通过为其指定不同的类型来实现属性 - 请参阅接口(C# 编程指南)

要实现接口成员,实现类的对应成员必须是公共的、非静态的,并且与接口成员具有相同的名称和签名

在您的特定情况下,您要么需要将ICollection<IB>其用作属性的类型,ABase要么按照 Konstantin Vasilcov 的建议使用 generic IA<T>

如果您不能采用通用路线,请考虑在“get”界面中设置属性 - 仅限。这样,您将能够不在类中提供 setter,并通过使用自定义方法将项目添加到集合来验证所有“添加到集合”操作。

于 2013-02-28T07:27:13.113 回答