2016-03-30 2 views
1

ich diese abstrakte Klasse habe:Abstrakte Klasse Verfahren mit unterschiedlichem Rückgabetyp in abgeleiteten Klasse

abstract class Animal { 

    public abstract List<??????> getAnimals(); 

} 

Ich mag den Rückgabetyp ändern, um dies zu machen:

 Animal animal; 

    if(/*Somthing*/){ 
      animal = new Cat(); 
      catList = animal.getAnimals(); 
    }else{ 
      animal = new Dog(); 
      dogList = animal.getAnimals(); 
    } 

Ich mag CatModelList zurückzukehren und a DogModelList.

Ist das möglich, wenn Hund und Katze Animal s als Basis hätten? Und wenn nicht, was ich denke, ist die Antwort, was wäre der richtige Weg, dies zu tun?

Antwort

4

Dann brauchen Sie Generika den Typ zu liefern:

abstract class Animal<T> : Animal where T : Animal 
{ 
    public abstract List<T> GetAnimals(); 
} 

abstract class Animal 
// base type to make things easier. Put in all the non-generic properties. 
{ } 

Wo T könnte Dog, Cat oder jede andere Art von Animal abgeleitet sein:

class Dog : Animal<Dog> 
{ } 

Dann können Sie es mit der Verwendung abgeleitet Klasse:

Dog d = new Dog(); 
animal = d; 
dogList = d.GetAnimals(); 

Es scheint jedoch seltsam. In einer Instanz von Animal bekommen Sie die Tiere? Ich verstehe diese Logik nicht.

+0

Es hat keine Logik, ich will es einfach halten. weil ich tatsächlich diffrent Modelle von den Tabellen mit einem Adaptermuster laden muss. und es ist ein Teil des Studiums. Vielen Dank für Ihre Aufmerksamkeit! – Ams1

+0

Muss ich das Animal für jeden generischen Typ instanziieren oder kann ich es nur am Anfang wie in meiner Frage installieren? – Ams1