2012-04-25 6 views
1

私のコードでは、後でそれぞれの派生型にキャストするベースクーラス付きのリストを使用しています。私は、ベースクラスのコンストラクタを作成して、それをどのような型にし、その型に変更するのかを考え出すことができると考えました。コンストラクタでオブジェクトタイプを変更する

public class BaseClass 
    { 
     // Constructor 
     BaseClass(string Input) 
     { 
      if (Input.Substring(0, 5) == "Something") 
       return new DerivedClass(); // <-- Not allowed 
     } 
    } 
    public class DerivedClass : BaseClass 
    { 
    } 

コンストラクタがvoidを返す必要があるため、これは許可されていません。 "this"のタイプの変更は許可されていないようです。私は、このコードには非常に単純な代替案があることを知っていますが、それはある種の優雅さを持っていると思います。

+4

他に何かを構築するコンストラクタは、エレガントであるべきですか? –

+0

あなたはC#のコンストラクタから何も返すことはできません。 'new'の結果は、常にその型の具体的なインスタンスです。これを行うには、工場を使う必要があります。ファクトリは、作成する派生型とそれを返す派生型を決定する単なる関数です。 –

+0

うわー、あなたはすごいです!私の要点は、これをコード化する方法を探すのではなく、言語そのものに関する議論である。私はこのアプローチを直感的に見つける唯一の人ですか? – RagnarDa

答えて

6

ファクトリパターンを調べる必要があります。これは、オブジェクトのインスタンスを作成したいが、特定のタイプを他のパラメータに基づいて決定できるようにする場合に使用されます。

public static class BaseClassFactory 
{ 
    public static BaseClass Create(string input) 
    { 
     if (input.Substring(0, 5) == "Something") 
      return new DerivedClass(); 

     return new BaseClass(); 
    } 
} 
+0

@JamesJohnson - 必要ありません。 –

+0

彼には良い例があります:http://www.dotnetperls.com/factory –

+0

またはwiki http://wiki.wikipedia.org/wiki/Factory_method_pattern – Patrick

2

私はFactory Patternもお勧めしますが、それとは異なります。これにより、newのBaseClassが作成されないため、クラスを取得する唯一のオプションはCreateメソッドです。

public class BaseClass 
{ 
    private BaseClass() 
    { 
    } 

    public static BaseClass Create(string input) 
    { 
    if (input.Substring(0, 5) == "Something") 
     return new DerivedClass(); 

    return new BaseClass(); 
    } 
} 
+0

は計算されません。静的クラスの非静的コンストラクタ。 –

+0

更新しました、ありがとう! –

+0

何らかの理由で私はあなたが今OA(元の回答者)が投稿したものだと思いました。だからこそ私は静的なクラスに困惑した。しかし、彼は静的です。とにかくこのパターンの+1(基本クラスの静的メソッドとしてのファクトリ)。抽象クラスでもうまくいきます! –