示例如下所示:
interface IA
{
ICollection<IB> Bs {get;set;}
}
interface IB
{
}
public class BBase : IB
{
}
public class ABase : IA
{
public ICollection<BBase> Bs { get; set; }
}
问题在于,当我想使用IA
实现接口BBase
时,正如我在ABase
中所做的那样,发生了错误。这是说我只能使用IB
代替BBase
来实现IA
中的ABase
吗?
答案 0 :(得分: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 :(得分:2)
您无法通过为其指定不同的类型来实现属性 - 请参阅Interfaces (C# Programming Guide):
要实现接口成员,实现类的相应成员必须是公共的,非静态的,并且具有与接口成员相同的名称和签名
在您的特定情况下,您需要使用ICollection<IB>
作为ABase
中的属性类型,或者按照Konstantin Vasilcov建议使用通用IA<T>
。
如果你不能去通用路线,只考虑在界面'get'中创建属性。这样,您就无法在类中提供setter,并通过使用自定义方法将项添加到集合中来验证所有“添加到集合”操作。