2013-02-28 72 views
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来执行IAABase

回答

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

接口的实现究竟应在其定义相匹配,所以在非通用情况下,你预计将有恰好ABaseICollection<IB> Bs {get;set;},即它可以接受任何IB实施。

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

欲了解更多信息阅读:

  1. Generic Interfaces (C# Programming Guide)
  2. where (generic type constraint) (C# Reference)
+0

+1 - 可接受的有用方法。将接口签名更改为通用可能无法在所有情况下使用。 – 2013-02-28 07:28:10

+0

@AlexeiLevenkov同意..在这种情况下,在我看来,OP只是开始设计 – horgh 2013-02-28 07:33:11

+0

非常感谢! – user2118486 2013-02-28 07:42:48

2

您不能为它指定不同类型的执行财产 - 见Interfaces (C# Programming Guide)

为了实现一个接口成员,这个工具的相应成员nting类必须是公开的,非静态的,并且具有相同的名称和签名的接口成员

在您的特定情况下,您可能需要使用ICollection<IB>作为一种财产在ABase或跟随康斯坦丁Vasilcov建议,使用通用IA<T>

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

相关问题