2017-01-24 4 views
1

У меня есть абстрактный класс Model, который реализован CarModel.Использовать локальный класс как возвращаемый тип из абстрактного класса

Я хочу иметь метод Clone в абстрактном классе Model, который я хочу вернуть тип экземплярирующего класса.

Например, я хотел бы CarModel реализации Model требовать Clone метод, который возвращает CarModel, как показано ниже:

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

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

Однако это не работает, потому что Clone должен быть типа Model. Это не результат, который мне бы хотелось, потому что тогда CarModel мог реализовать метод Clone, который фактически возвращает 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) вы все еще не применяете ограничение полностью, и я могу написать 'class HumanModel: Model ' 2), это не так просто понять. Но это может помочь вам указать правильный тип как тип возврата/ввода для членов базового класса. Либо вы имеете дело с базовым типом, либо у вас есть 1) и 2) –

+1

Спасибо Сергею. Хорошее решение для того, что мне нужно :) –

Смежные вопросы