代码之家  ›  专栏  ›  技术社区  ›  Brian MacKay

接口继承:方法不显示!

  •  2
  • Brian MacKay  · 技术社区  · 16 年前

    我遇到了一个接口继承问题,这个问题困扰了我一段时间。这似乎没有任何意义,我只能断定我遗漏了一些基本的东西。

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

    1 回复  |  直到 16 年前
        1
  •  2
  •   JaredPar    16 年前

    IOrderQueryRoot 是非法的,并导致编译器错误。原因是如果您应该调用 IHasOrderLogicalOperators.EndClause 或 IHasOrderFields.EndClause

    Dim v1 As IOrderQueryRoot
    v1.EndClause()
    

    Intellisense致力于仅建议法律法规。此代码不合法,因此未列出。

    伊奥德奎罗酒店 该决议是明确的,因为有一个单一的功能。原汁原味 伊奥德奎罗酒店