2017-01-24 9 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を実施したいと思います。これは、CarModelが実際にBikeModelを返すCloneメソッドを実装できるため、私が望む結果ではありません。

これはできますか?そしてもしそうなら、どうですか?

+1

[ジェネリックを利用し、C#の共変戻り値の型](の可能性のある重複http://stackoverflow.com/questions/4348760/c-sharp-covariant-return-types-有用なジェネリック) –

答えて

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まあ、それは2つの短所があります1)あなたはまだ完全に制約を強制せず、 'class HumanModel:Model 'と書くことができます2)それは理解するのが一番簡単なことではありません。しかし、基底クラスメンバの戻り型/入力型として正しい型を指定するのに役立ちます。代わりにベースタイプを扱うか、1)と2)を持っているか –

+1

Sergeyありがとう。私は後に何のための良い解決策:) –

関連する問題