2016-10-01 6 views
2

주조 유형 I가 다음과 같은 질문을 읽고 (그리고 나는 주어진 대답으로 같은 방법으로 해결할 것) : Passing derived type as argument to abstract class일반적인 방법과

그러나 이유는 파생 클래스에서 value 속성을 찾을 수 없습니다? 나는 타입 캐스트를 추가해도 그것은 불가능하다 : 타입 캐스트와

public abstract class baseClass 
{ 
    public abstract float function<T>(T a, T b) where T:baseClass; 
} 

public class derived: baseClass 
{ 
    public override float function<derived>(derived a, derived b) 
    { 
     // Here value is not found 
     return a.value + b.value; 
    } 

    public float value; 
} 

예는 작동하지 않습니다 (그리고 조언 중복 타입 캐스트가 표시됩니다) :

public abstract class baseClass 
{ 
    public abstract float function<T>(T a, T b) where T:baseClass; 
} 

public class derived: baseClass 
{ 
    public override float function<derived>(derived a, derived b) 
    { 
     // Here value is not found even with type cast 
     return ((derived)a).value + ((derived)b).value; 
    } 

    public float value; 
} 
+0

예제가 작동 -이 문제를 명명합니다. 제네릭 타입 매개 변수의 이름을 다시'T'로 바꾸면'derived'로 캐스팅 할 수 있습니다. – 2kay

+0

@ 2kay 힌트를 주셔서 감사합니다 –

답변

2

당신이 선언하고 있기 때문에 메서드의 제네릭 형식 매개 변수 컴파일러는이 형식이 derived이어야 함을 이해하지 못합니다. 새로운 제네릭 형식 매개 변수를 도입 한 것은 모두 알고 있습니다. 형식 매개 변수는 재귀 적으로 정의 된 구현 클래스의 어디 당신이 원하는 무엇

F-bound polymorphism라고 : 타입 캐스트와

public abstract class BaseClass<T> where T : BaseClass<T> 
{ 
    public abstract float Function(T a, T b); 
} 

public class Derived : BaseClass<Derived> 
{ 
    public override float Function(Derived a, Derived b) 
    { 
     return a.Value + b.Value; 
    } 

    public float Value { get; set; } 
} 
+0

하지만 explicite를 추가 할 때 형식을 알고 있어야하지 않습니까? –

+0

@KevinWallis 컴파일러는 'derived'를 작성한 'derived'유형으로 처리하지 않습니다. 그것의 관점에서 보면'Base'가'Function'을 선언하고'T' 매개 변수를 두 개 가지고 있기 때문에'derived'라고하는 * generic 형식 매개 변수 *입니다. –

+0

대답 해 주셔서 감사합니다! –