我有一个接口继承问题,一直困扰着我。它似乎没有任何意义,我只能断定我缺少一些基本的东西。
概述
以下代码来自我们ORM工具的流畅界面的一部分。它提供了一种类似SQL的语法,用于从数据库中提取数据。您不必完全了解所有相互关系以了解问题 - 真正的问题是EndClause方法。
EndClause问题
有一个名为EndClause的方法没有显示在一个预期的位置 - IOrderQueryRoot。据我所知,应显示,因为它继承自两个不同的接口两者都有一个名为EndClause的方法,但当我使用一个实现IOrderQueryRoot的对象时,EndClause没有弹出intellisense。
下面还有一些实施细节。
首先,如果你看一下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方法。当“最终开发人员”试图实际编写针对接口的代码时,问题就是一个级别。
如果有什么东西突然袭来,请告诉我 - 这个让我疯了很长时间!
答案 0 :(得分:2)
Intellisense中不存在这种情况的原因是通过接口IOrderQueryRoot
调用函数EndClause是非法的,并导致编译器错误。如果您应该致电IHasOrderLogicalOperators.EndClause
或IHasOrderFields.EndClause
,原因是无法区分以下代码。
Dim v1 As IOrderQueryRoot
v1.EndClause()
Intellisense努力只建议合法代码。此代码不合法,因此未列出。
是的,在IOrderQueryRoot
的实施中,解决方案是明确的,因为只有一个功能。对于原始IOrderQueryRoot
虽然此分辨率不明确,因此未正确列出。