2017-01-24 6 views
1

CarModel에 의해 구현되는 추상 클래스 Model가 있습니다.추상 클래스의 반환 유형으로 로컬 클래스 사용

나는 Model 추상 클래스에 메서드 Clone을 갖고 싶습니다.이 클래스는 인스턴스화하는 클래스의 유형을 반환하려고합니다. Clone 유형 Model이어야하기 때문에

abstract class Model 
{ 
    public abstract Model Clone(); 
} 

class CarModel : Model 
{ 
    public override CarModel Clone() { 
     return undefined; 
    } 
} 

그러나이 작동하지 않습니다

예를 들어, 나는 CarModel 아래처럼 CarModel를 반환하는 Clone 방법을 필요로 Model을 구현하고 싶습니다. 이 결과는 CarModelClone 메서드를 구현하여 실제로 BikeModel을 반환 할 수 있기 때문에 내가 원하는 결과는 아닙니다.

이 작업을 수행 할 수 있습니까? 그렇다면 어떻게?

+1

[제네릭을 사용하는 C#의 공변 리턴 타입] (의 가능한 중복 http://stackoverflow.com/questions/4348760/c-sharp-covariant-return-types- 활용 - generics) –

답변

4

당신의 기본 클래스는 일반적인 확인 :

abstract class Model<T> 
    where T: Model<T> 
{ 
    public abstract T Clone(); 
} 

class CarModel : Model<CarModel> 
{ 
    public override CarModel Clone() 
    { 
     return ... 
    } 
} 
+0

그리고 이것은 C#에서 좋은 연습입니까? 이 작업을 할 수 있지만 기본 클래스에 대한 클래스를 범용 형식으로 전달하는 것이 옳은지 확실하지 않습니다. –

+0

@JamesMonger 글쎄요, 두 가지 단점이 있습니다. 1) 여전히 제약 조건을 완전히 적용하지 않고'HumanModel : Model '클래스를 작성할 수 있습니다. 2) 이해하기가 쉽지 않습니다. 그러나 기본 클래스 멤버에 대한 반환/입력 형식으로 올바른 형식을 지정하는 데 도움이 될 수 있습니다. 기본 유형을 대신 처리하거나 1)과 2)가 있습니다 –

+1

Sergey 감사드립니다. 내가 뭘했는지에 대한 좋은 해결책 :) –

관련 문제