【问题标题】:Interface Inheritance: Method does not show up!接口继承:方法不显示!
【发布时间】:2011-01-17 03:03:41
【问题描述】:

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

概述

以下代码来自我们的 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 方法。当“最终开发人员”试图针对接口实际编写代码时,问题就在下一级。

如果你有什么意外,请告诉我——这个让我发疯了很长时间!

【问题讨论】:

    标签: .net vb.net inheritance interface fluent-interface


    【解决方案1】:

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

    Dim v1 As IOrderQueryRoot
    v1.EndClause()
    

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

    是的,在您的IOrderQueryRoot 实现中,分辨率是明确的,因为只有一个函数。对于原始的IOrderQueryRoot,尽管此分辨率不明确,因此未正确列出。

    【讨论】:

    • 只是想一想——我知道有一个模棱两可的问题,但如果这是一个问题,VS 不应该对我大喊大叫吗?
    • 我猜答案是 VS 相当不错,但并不能完全捕捉到所有奇怪的场景,嗯?
    • 就是这样——它确实可以编译。但我认为贾里德是对的。这是一个模棱两可的问题,我需要做一些巧妙的重构。希望这实际上是可能的。
    • 是的,我试过隐藏一个,但没有用。但它确实编译。我认为通过更连贯的设计,您既可以解决设计时间问题,又可以得到更强大的 api。
    • @Sky Sanders:嗯,它是一个流畅的 API... 需要能够处理以下内容:Order.Select.OrderID.Between(5, 10).AndNot.OrderStatus(5)。 OrderBy(OrderCreationDate, Descending) ... 除了这个小问题之外,它实际上已经工作了多年,但如果你知道一种不太复杂的方法,请告诉我 :)
    猜你喜欢
    • 2012-03-20
    • 1970-01-01
    • 2023-04-02
    • 2012-09-07
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多