2011-09-06 2 views
8

제네릭 형식의 한 가지 방법을 가진 기본 클래스가 있으며 파생 된 부분에서 문자열을 반환 할 것이라고 확신합니다. 이것은 내 코드입니다.형식 매개 변수 선언은 형식이 아닌 식별자 여야합니다

public abstract class Base 
    { 
     public virtual T GetSomething<T>() 
     { 
      return default(T); 
     } 
    } 

    public class Extended : Base 
    { 
     public override string GetSomething<string>() 
     { 
      return string.Empty; 

      //return base.GetSomething<T>(); 
     } 
    } 

하지만이 코드는 컴파일되지 않습니다. 아무도 실수를 발견 할 수 있습니까? 확장 클래스에서 문자열 만 반환하고 싶습니다. 어떻게 해결할 수 있습니까?

답변

8

구체적인 구현으로 일반 메서드를 재정의 할 수 없습니다. 그것은 generics가 작동하는 방식이 아닙니다. Extended 클래스는 예를 들어 GetSomething<int>()에 대한 호출을 처리 할 수 ​​있어야합니다.

즉, 재정의하는 메소드에 대한 서명은 동일이어야합니다. 메소드의 구체적인 제네릭 구현을 지정하면 해당 메소드의 서명이 변경됩니다.

이 방법을 사용하는 것이 좋습니다 :이 방법의 특정 인스턴스를 컴파일 할 때 JIT는 조건을 최적화 할 것을

public override T GetSomething<T>() 
{ 
    if (typeof(T) == typeof(string)) 
     return string.Empty; 

    return base.GetSomething<T>(); 
} 

참고. (그렇지 않은 경우 매우 좋은 JIT가 아닙니다.)

(대체 문법은 기술적으로는 정확하지만 다른 이유로도 실패합니다. 예를 들어, string을 사용할 수 없습니다. 가능하면 컴파일러가 수퍼 유형에서 해당 서명이있는 메소드를 찾을 수 없으므로 코드가 원하는 것을 수행하지 못하거나 컴파일하지 않습니다.

+2

또는 기본을 변경하십시오. 'public abstract class Base ' – Eranga

+0

으로, 그리고 나서'Extended : Base '로 클래스 선언을 할 수 있습니다. 확실히 가능합니다. OP가 무엇을 달성하려고하는지 즉시 알 수는 없으므로 클래스 디자인을 최소한으로 변경해야하는 접근법을 선택했습니다. – cdhowie

관련 문제