2009-09-09 9 views
5

OK、そのタイトルが少し不明であるが、私はそれを説明する以外に、それを置くことのより良い方法を考えることはできません...継承された静的メソッドのクラスコンテキストを検出することは可能ですか?

は、私は、静的な、汎用的な方法で、クラスAnimalを持っていると言います。

public static T Create<T>() where T : Animal { 
    // stuff to create, initialize and return an animal of type T 
} 

そして、私はサブクラスDogCatを持って、HamsterなどDogを得るためには、私が書くことができます:

Dog d = Animal.Create<Dog>(); 

O r

Dog d = Dog.Create<Dog>(); 

実際には同じことです。しかし、Dogサブクラスを介して既に静的メソッドを呼び出しているので、Dogを何度も書く必要があります。私は、サブクラスのそれぞれにCreate()方法を記述することなく

Dog d = Dog.Create(); 
Cat c = Cat.Create(); 
Hamster h = Hamster.Create(); 

を呼び出すことができるように

あなたは、基本クラスでCreate()メソッドを書くのいずれかの巧妙な方法を考えることはできますか?

答えて

10

Animalクラスを汎用にすることができます。

しかし、Animalクラスは派生型のインスタンスを作成する方法をどのように知っていますか?

+2

'T'をAnimalsに制限したいと思うかもしれません:' class Animal T:Animal ' – dtb

+0

@dtb:確かに!レスポンスが更新されました。 –

+0

Create()内のコードは、仮想/抽象メソッドを呼び出します。つまり、派生型のインスタンスを作成する方法です。 –

2

静的なCreateメソッドを使ってAnimalクラスの抽象化を行います。効果的に工場の出発点になります。実際、あなたが工場クラスを元に戻すように見えます。

あなたは動物のクラスに抽象初期メソッドを追加する場合は、メソッドを作成しますが、次のようになります。

public static T Create<T>() where T : Animal { 
    T animal = new T(); //may need a "new" in the declaration 
    animal.Initialize(); //or Create or whatever or you put this logic 
         // in the constructor and don't call this at all. 
    return animal; 
} 
+0

動物ができません:TPresenterたIView を静的なクラスであるただし、作成を各派生型に委譲したい場合は、Animal abstractを作成し、VirtualではなくAbstract initializeメソッドを作成することをお勧めします。 –

+0

良いキャッチ。それは意図ではありませんでした。 –

+0

@Romain - よく言えば、私は自分の答えを調整しました。 –

1

それを回避する方法の他の回答に加えて、あなたは常に意志を作成リフレクションを使用して見ることができますそれでも派生クラスではなく、Animalの一部になります。

関連する問題