2017-09-26 13 views
2

여기 내 문제가 있습니다.명시 적 변환없이 항상 올바른 유형을 얻는 방법

public class C1 
{ 
    public C1 GetThis() 
    { 
     return this; 
    } 
} 

public class C2:C1 
{ 

} 

지금, 나는 이러한 클래스를 다음과 같은 방법을 사용하려면 :

private static void Main(string[] args) 
{ 
    C1 c1 = new C1().GetThis(); //1st line 
    C2 c2 = new C2().GetThis(); //2nd line 
} 

그러나, 두 번째 줄은 작동하지 않습니다 나는 다음과 같은 2 개 종류가있다. 나는 매우 게으른 사람이고 명시 적 변환 (캐스트)를 작성 피하려고,

C2 c2 = (C2)new C2().GetThis(); //2nd line 

을하지만 : 작동하려면이 같은 캐스팅해야합니다. 그래서 질문입니다 : 두 번째 줄을 캐스팅하지 않고 작동하도록 GetThis() 메서드의 구현/선언을 어떻게 변경해야합니까?

팁 주셔서 감사합니다.

답변

4

GetThis() 메서드의 구현/선언을 어떻게 변경해야합니까?

public class C2 : C1 
{ 
    public new C2 GetThis() 
    { 
     return this; 
    } 
} 

new modifier

명시 상속되는 부재 숨겨 :

하나의 가능성은 new 개질제를 이용하여 대응하는 반환 값 클래스 C2의 방법을 선언하는 것 기본 클래스에서

3

당신이 요구하는 정확한 것은 C#에서는 불가능합니다. 반환 값은 "반환 값은 this이므로 형식이 알려져 있습니다."라는 반환 형식이 없습니다. 유형 시스템의 관점에서 보면 void을 반환하면 이미 호출자에게 필요한 모든 정보가 제공됩니다 (호출자는 이미 호출 한 객체를가집니다). C# 관점에서 볼 때 코드를보다 명확하게 만들 수 있다는 것은 사실입니다.

주위 방법 중 하나는 제네릭입니다 :

public class C1<T> where T : C1<T> { 
    public T GetThis() { return (T) this; } 
} 

public class C2 : C1<C2> { } 

이 같이있는 것, 그것은 C3뿐만 아니라 C1<C2>에서 파생 할 수 있기 때문에 유형 또는 주석, "this 반환"진정한 같은 형식 안전하지 않습니다 런타임에 예외가 발생하게되면 컴파일 타임 진단이 제공되지 않습니다.