2009-03-09 16 views
1

私はこのような何かを持っている:一般抽象クラスを返すには?

そのconstrustorsがプライベートであるため、これらのクラスをインスタンス化することはできませんので、我々は次のように行うことができないことが非常に重要である
abstract class BaseClass<T> 
{ 
    protected BaseClass(){} 
} 

class Class1 : BaseClass<Class1> 
{ 
    public static Class1 Instance = new Class1(); 
    private Class1(){}   
} 

class Class2 : BaseClass<Class2> 
{ 
    public static Class2 Instance = new Class2(); 
    private Class2(){}  
} 

... 
public BaseClass<T> Method<T>(int z) where T: BaseClass<T> 
{ 
    switch(z) 
    { 
     case 1: 
      return Class1.Instance; 
     case 2: 
      return Class2.Instance; 
    } 
} 

public BaseClass<T> Method<T>(int z) where T: BaseClass<T>,新しい()

方法戻り値の型として抽象クラスを使用できますか?私はこれを解決できません。ここで何か助けに感謝します。

+0

事実、「メソッド」はファクトリメソッドと似ています...全体の依存関係は少し複雑で、私はできるだけ単純なスケルトンとして投稿しました。 Class1.InstanceがClass1を返すように変換できないという問題が発生しました

答えて

0
abstract class BaseClass<T> 
{ 
    public abstract T Instance { get; } 

    protected BaseClass(){} 
} 

多分?あなたはとにかくやろうとしているもの...私は何をやろうとしていることさえ可能であるとは思わない...よく見るには、私は信じている静的なもの...


を継承することはできません?


タイプ制約はタイプ制約です。種類のメソッドの型制約を変更しようとしています。これは明らかにうまくいかず、うまくいきません。私はあなたの問題を攻撃する別の方法を考える必要があると思います。それが何であれ...

+0

それは役に立たないでしょう。オブジェクトのインスタンスを作成せずにインスタンスプロパティをどのように呼び出すのですか? –

+0

よく、良い点:pしかし、静的なものを継承することはできませんが、この場合、なぜ最初にそれらの静的なプロパティを使って行う必要がありますか? – Svish

0

factory patternを見てください。あなたのファクトリにインスタンスを取得するためのメソッドがあります。初めて呼び出されると、インスタンスが作成されます。その後の呼び出しでは、すでに作成されたインスタンスを返すことができます。

2

私にはあなたが本当にそのメソッドを一般的にすることはできないように思えます。たとえば、私が電話をしたときにどうなるでしょうか。

BaseClass<Class1> foo = Method<Class1>(2); 

タイプ引数または通常の引数のいずれかが必要です。非ジェネリックな基底クラスを持つことでメソッドの引数にすることができます(既存の基底クラスを非ジェネリックにするか、ジェネリックでない基底クラスをそれに導入することによって)。戻り値のタイプMethodをこの非ジェネリック基本クラスに変更します。

+0

"真実の単一点" ...私はそれが好きです。 –

関連する問題