Наследование интерфейса: метод не отображается! - PullRequest
2 голосов
/ 15 февраля 2010

У меня проблема с наследованием интерфейса, которая меня раздражала в течение некоторого времени. Кажется, в этом нет никакого смысла, и я могу только заключить, что мне не хватает чего-то фундаментального.

Обзор

Приведенный ниже код является частью свободного интерфейса для нашего инструмента 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. Проблема на один уровень ниже, когда «конечный разработчик» пытается фактически написать код для интерфейса.

Пожалуйста, дайте мне знать, если что-то выскакивает у вас - это уже давно сводит меня с ума!

1 Ответ

2 голосов
/ 15 февраля 2010

Причина, по которой этого нет в Intellisense, заключается в том, что вызов функции EndClause через интерфейс IOrderQueryRoot недопустим и приводит к ошибке компилятора. Причина в том, что невозможно отличить от следующего кода, если вы должны позвонить IHasOrderLogicalOperators.EndClause или IHasOrderFields.EndClause.

Dim v1 As IOrderQueryRoot
v1.EndClause()

Intellisense стремится предложить только юридический кодекс. Этот код не является законным и, следовательно, он не указан.

Да, в вашей реализации IOrderQueryRoot разрешение однозначно, поскольку есть одна функция. Для необработанного IOrderQueryRoot хотя это разрешение неоднозначно и, следовательно, правильно не указано.

...