2

我有一个接口继承问题一直困扰着我一段时间。这似乎没有任何意义,我只能得出结论,我错过了一些基本的东西。

概述

下面的代码来自我们 ORM 工具的流利界面的一部分。它提供了一种类似 SQL 的语法,用于从数据库中提取数据。你不必完全理解所有的相互关系来理解问题——真正的问题是 EndClause 方法。

EndClause 问题

有一种名为 EndClause 的方法没有出现在预期的位置——IOrderQueryRoot。据我所知,它应该显示出来,因为它继承自两个不同的接口,这两个接口都有一个名为 EndClause 的方法,但是当我使用一个实现 IOrderQueryRoot 的对象时,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 方法。当“最终开发人员”试图针对接口实际编写代码时,问题就在下一级。

请让我知道如果有什么东西在你身上跳出来 - 这个已经让我发疯了很长时间!

4

1 回答 1

2

Intellisense 中不存在这个的原因是通过接口调用函数 EndClauseIOrderQueryRoot是非法的,会导致编译器错误。IHasOrderLogicalOperators.EndClause如果您应该调用or ,则无法与以下代码区分开来的原因IHasOrderFields.EndClause

Dim v1 As IOrderQueryRoot
v1.EndClause()

Intellisense 力求只建议合法代码。此代码不合法​​,因此未列出。

是的,在您IOrderQueryRoot的解决方案实施中是明确的,因为只有一个功能。对于原始的,IOrderQueryRoot虽然这个分辨率是模棱两可的,因此没有正确列出。

于 2010-02-15T19:48:10.010 回答