如何实现一个已经有其他接口的接口?

时间:2013-02-28 07:00:22

标签: c# interface

示例如下所示:

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吗?

2 个答案:

答案 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. Generic Interfaces (C# Programming Guide)
  2. where (generic type constraint) (C# Reference)

答案 1 :(得分:2)

您无法通过为其指定不同的类型来实现属性 - 请参阅Interfaces (C# Programming Guide)

  

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

在您的特定情况下,您需要使用ICollection<IB>作为ABase中的属性类型,或者按照Konstantin Vasilcov建议使用通用IA<T>

如果你不能去通用路线,只考虑在界面'get'中创建属性。这样,您就无法在类中提供setter,并通过使用自定义方法将项添加到集合中来验证所有“添加到集合”操作。