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