我遇到了一个接口继承问题,这个问题困扰了我一段时间。这似乎没有任何意义,我只能断定我遗漏了一些基本的东西。
下面的代码来自我们的ORM工具的fluent接口的一部分。它提供了一种类似SQL的语法,用于从数据库中提取数据。您不必完全摸索所有的相互关系来理解问题——真正的问题是EndClause方法。
有一个名为EndClause的方法,它不会出现在一个预期的位置——IOrderQueryRoot。据我所知,它
应该
二者都
有一个名为EndClause的方法,但当我使用一个实现IOrderQueryRoot的对象时,在intellisense中不会弹出EndClause。
不过,首先,如果您查看IOrderQueryRoot(其中包含EndClause),您可以看到它继承了IHasOrderLogicalOperators和IHasOrderFields(其中也包含EndClause)。
Public Interface IHasOrderLogicalOperators
Function [And]() As IHasOrderFields
Function [AndNot]() As IHasOrderFields
Function [Not]() As IHasOrderFields
Function [Or]() As IHasOrderFields
Function [OrNot]() As IHasOrderFields
Function EndClause() As IHasOrderLogicalOperators
End Interface
Public Interface IHasOrderFields
Function OrderID(ByVal value As Int32) as IHasOrderLogicalOperators
Function OrderID() As IHasOrderComparisonOperators
Function PracticeID(ByVal value As Int32) as IHasOrderLogicalOperators
Function PracticeID() As IHasOrderComparisonOperators
'note: I cut about a page of additional order-related fields you don't need to see.
Function BeginClause() As IHasOrderFields
Function EndClause() As IHasOrderLogicalOperators
End Interface
Public Interface IOrderQueryRoot
Inherits IHasOrderFields, IHasOrderLogicalOperators
End Interface
我认为问题一定与以下事实有关:EndClause方法从继承链的不同位置进入IOrderQueryRoot两次。信息技术
做
我们需要这样做。
因为您可能希望看到我实际使用接口的地方,所以我使用的代码如下:
Public Function EndClause() As IHasOrderLogicalOperators Implements IHasOrderFields.EndClause, IHasOrderLogicalOperators.EndClause
Me.Query.EndClause()
Return New OrderQueryElement(Query)
End Function
此时,接口工作正常——如果我删除此方法,VS会尖叫我必须实现两个EndClause方法。当“最终开发人员”试图针对接口实际编写代码时,问题就出现了。