2

しばらくの間、私を悩ませてきたインターフェイスの継承の問題があります。意味がないようで、根本的な何かが欠けているとしか結論付けられません。

概要

以下のコードは、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 レベル下にあります。

何か思いついたら教えてください -- これは長い間私を夢中にさせてきました!

4

1 に答える 1

2

これが Intellisense に存在しない理由は、インターフェイスを介して関数 EndClause を呼び出すことIOrderQueryRootは違法であり、コンパイラ エラーが発生するためです。IHasOrderLogicalOperators.EndClauseまたはを呼び出す必要がある場合、次のコードと区別できないのはなぜですかIHasOrderFields.EndClause

Dim v1 As IOrderQueryRoot
v1.EndClause()

Intellisense は、合法的なコードのみを提案するよう努めています。このコードは合法ではないため、記載されていません。

はい、IOrderQueryRoot単一の機能があるため、解像度の実装では明確です。ただし、生の場合IOrderQueryRoot、この解像度はあいまいであるため、正しくリストされていません。

于 2010-02-15T19:48:10.010 に答える