2010-02-15 5 views
2

나는 얼마 동안 나를 괴롭 히고있는 인터페이스 상속 문제를 가지고있다. 어떤 의미가없는 것처럼 보이고, 나는 근본적으로 뭔가 빠져 있다는 결론을 내릴 수 있습니다.인터페이스 상속 : 메서드가 표시되지 않습니다!

개요

아래의 코드는 우리의 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 메서드를 구현해야하는 비명 것입니다. "최종 개발자"가 실제로 인터페이스에 대해 코드를 작성하려고 할 때 한 단계 아래로 문제가 발생합니다.

내가 너에게 뭔가 뛰어 ​​내리는 지 알려 줘라 .-이게 나를 오랫동안 미치게 만들었다.

답변

2

Intellisense에 이것이 존재하지 않는 이유는 IOrderQueryRoot 인터페이스를 통해 EndClause 함수를 호출하면 컴파일러 오류가 발생하고 결과적으로 유용합니다. IHasOrderLogicalOperators.EndClause 또는 IHasOrderFields.EndClause을 호출해야하는 이유는 다음 코드와 구별 할 수없는 이유입니다.

Dim v1 As IOrderQueryRoot 
v1.EndClause() 

Intellisense는 법적 코드만을 제안하려고 노력하고 있습니다. 이 코드는 유효하지 않으므로 나열되지 않습니다.

예, 구현시 IOrderQueryRoot은 단일 기능이 있기 때문에 해상도가 명확합니다. 이 해상도는 모호하기 때문에 정확하게 표시되지 않지만 원시 IOrderQueryRoot입니다.

+0

단 하나의 생각 - 나는 모호성 문제가 있다는 것을 알았지 만 이것이 문제라면 VS가 내게 소리 지르지 않아야합니까? –

+1

나는 VS가 꽤 좋지만 절대적으로 모든 이상한 시나리오를 잡아 내지 못한다는 대답을 추측하겠습니까? –

+0

@brian : 컴파일합니까? –

관련 문제