2017-12-11 22 views
-1

나는 내가 무엇을하려고하는지에 대한 이름을 모른다는 것이 확실하다. 그렇지 않으면 내 인터넷 검색이 더 성공적 일 것이다. 나는 현재 같은 명명 된 방법으로 인터페이스에 관련된 결과 만 찾습니다.인터페이스 대 클래스 메서드 매개 변수 모호성

공통 기본 클래스에서 상속 받고 인터페이스를 구현하는 클래스가 몇 개 있습니다. 기본 클래스 또는 인터페이스를 매개 변수로 받아들이는 메소드가 있습니다. ConcreteExecutionClass의 통화 DoThings (된 IQueryable < A>)와 DoThings (된 IQueryable < B>) ':이 오류

호출이 다음과 같은 방법 또는 속성 간의 모호과 모호성을 야기하기 때문에 나는 컴파일 할 수 없습니다.

제네릭의 형식 제약이 고유 한 메서드 서명을 만들지 않기 때문에 제네릭이 작동하지 않습니다.

매개 변수 유형에 따라 특정 메서드로 강제로 실행되도록하는 방법 (또는 허용되는 패턴)이 있습니까?

public abstract class A { 
    // some properties 
} 

public class ConcreteA : A { 
    // full implementation 
} 

public interface B { 
    // a property 
} 

public class ConcreteAB : A, B { 
    // full implementation 
} 

public abstract class ExecutionClass { 
    public IQueryable<A> DoThings(IQueryable<A> content){ 
     return A.method().AsQueryable(); 
    } 

    public IQueryable<B> DoThings(IQueryable<B> content){ 
     return B.interfaceRequiredMethod().method().AsQueryable(); 
    } 
} 

public class ConcreteExecutionClass : ExecutionClass { 
    public void Program(){ 
     var objectList = new List<ConcreteAB>{/*....*/}; 
     DoThings(objectList); 
    } 
} 

콘크리트 클래스의 각

각각 DoThings()를 호출 할 객체의 목록에 클래스 관리 LINQ 쿼리가 있습니다. 목표는 실제 클래스 DoThings()의 실제 구현을 투명하게 유지하는 것입니다.

인터페이스에서 공분산을 시도했지만 첫 번째 코드 경로를 강제 종료하는 A를 상속하는 것을 피할 수 없었습니다.

위의 코드는 실제 구현을 단순화 한 것입니다. A과및 B에서 파생 된 4 개의 클래스가 약 10 개 있습니다.

+1

'ConcreteAB'에 대해 어떤 방법으로 호출 할 것으로 기대하십니까? 그리고 왜? – Rob

+1

https://stackoverflow.com/questions/42078610/c-sharp-generic-method-resolution-fails-with-an-ambiguous-call-error/42078735#42078735 – Ryu

+0

@Ryu에서 해당 게시물을 참조하십시오. 제네릭이 작동하지 않는다고 말했습니다. – kskid19

답변

0

간단히 말해서 추상 A가 기본이고 거기에서 상속하는 2 개의 추상 클래스가있는 추상 계층을 만들었습니다.