しばらくの間、私を悩ませてきたインターフェイスの継承の問題があります。意味がないようで、根本的な何かが欠けているとしか結論付けられません。
概要
以下のコードは、ORM ツールの流暢なインターフェースの一部です。データベースからデータをプルするための SQL に似た構文を提供します。問題を理解するためにすべての相互関係を完全に理解する必要はありません。本当の問題は EndClause メソッドです。
EndClauseの問題
EndClause というメソッドがあり、IOrderQueryRoot という 1 つの予想される場所に表示されません。私の知る限り、EndClauseというメソッドを持つ2 つの異なるインターフェイスを継承しているため表示されるはずですが、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 に 2 回入るという事実と関係があるに違いないと思います。そのように機能する必要があります。
私が実際にインターフェイスを使用する場所を見たいと思うかもしれないので、私が使用しているコードは次のとおりです。
Public Function EndClause() As IHasOrderLogicalOperators Implements IHasOrderFields.EndClause, IHasOrderLogicalOperators.EndClause
Me.Query.EndClause()
Return New OrderQueryElement(Query)
End Function
この時点で、インターフェイスは正常に動作しています。このメソッドを削除すると、VS は両方の EndClause メソッドを実装する必要があると叫ぶでしょう。問題は、「最終開発者」がインターフェイスに対して実際にコードを記述しようとしているときの 1 レベル下にあります。
何か思いついたら教えてください -- これは長い間私を夢中にさせてきました!