2009-09-09 18 views
5

OK, że tytuł jest trochę niejasne, ale nie mogę wymyślić lepszego sposobu oddania go, inne niż wyjaśniając ...Czy można wykryć kontekst klasy w odziedziczonej metodzie statycznej?

Say mam klasy Animal, ze statycznym, metody rodzajowe:

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

I mam podklasy Dog, Cat, Hamster itd. W celu uzyskania Dog, mogę napisać:

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

o r

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

co jest naprawdę tym samym. Ale wydaje mi się dość głupio pisać tyle razy, aby napisać Dog, ponieważ już inwokuję statyczną metodę poprzez podklasę Dog.

można myśleć o jakiejkolwiek sprytny sposób pisania metodę Create() w klasie bazowej, abym mógł powołać

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

bez pisania metodę Create() w każdym z podklasy?

Odpowiedz

10

Możesz ustawić klasę zwierząt jako ogólną.

class Animal<T> where T : Animal<T> 
{ 
    public static T Create() 
    { 
     // Don't know what you'll be able to do here 
    } 
} 

class Dog : Animal<Dog> 
{ 

} 

Ale jak klasa Animal umie tworzyć instancje typów pochodnych?

+2

Prawdopodobnie będziesz chciał ograniczyć 'T' do zwierząt:' klasa Animal gdzie T: Animal ' – dtb

+0

@dtb: Pewnie! Odpowiedź zaktualizowana, dziękuję. –

+0

Kod wewnątrz funkcji Create() wywoła metody wirtualne/abstrakcyjne, dzięki czemu utworzy instancje typów pochodnych. –

2

Chciałbym uczynić klasę Zwierząt abstraktem za pomocą statycznej metody Create; to faktycznie punkt wyjścia dla fabryki. Wygląda na to, że cofasz klasę fabryczną.

Jeśli dodać abstrakcyjne Initialize metodę do klasy Zwierząt, metoda Tworzenie się:

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

zwierzę nie może być klasą statyczną.Jeśli jednak chcesz przekazać kreację każdemu z wyprowadzonych typów, dobrym pomysłem może być sprawienie, by Animal był abstrakcyjny, a metoda Inicjuj streszczenie zamiast wirtualnej. –

+0

Dobry połów. To nie było intencje. –

+0

@Romain - dobrze, poprawiłem odpowiedź. –

1

W uzupełnieniu do innych odpowiedzi na sposoby wokół niego, można zobaczyć przy użyciu odbicia, które tworzą zawsze nadal będą częścią Animal, a nie klasy pochodnej.

Powiązane problemy