2016-05-27 8 views
1

Ich war neugierig, ob es möglich war, wie eine abstrakte Elternklasse zu erstellen, dass ich eine bestimmte Menge von Methoden definieren kann, aber die untergeordneten Klassen verschiedene Entitätstypen enthalten? Codebeispiel:Ist es möglich, eine generische abstrakte Elternklasse für verschiedene Typen zu erstellen?

public abstract class BaseService 
{ 
    public abstract void Add(); 

    public abstract void Delete(); 

    public abstract void Update(); 

    public abstract void Get();   
} 

vielleicht in der Lage sein, so etwas wie public abstract List<'random type'> GetAll();

zu tun, aber hier würde ich jede Methode mit bestimmten Parametern außer Kraft setzen möchten, die zu jedem seiner Kinder spezifisch sind:

public class CategoryService : BaseService 
{ 
    public override void Add(){ } 

    public override void Delete(){ } 

    public override void Update(){ } 

    public override void Get(){ } 
} 

In meiner untergeordneten Klasse möchte ich jedoch, dass meine Methode Get() eine bestimmte Liste < "Type"> (in diesem Fall Kategorie) zurückgibt. Darüber hinaus möchte ich public override Add(int CategoryID) statt der ererbten Add von BaseService tun.

Ist das möglich? Gedanken? Bin ich nur verrückt? Oder versuche ich, das komplizierter zu machen, als es sein muss? Ich habe ungefähr 10 verschiedene Service-Typen, die ich sicherstellen möchte, dass diese generischen Methoden von BaseService erhalten.

Vielen Dank im Voraus!

+0

Kurze Antwort ja. – Nkosi

+1

Wenn Sie in allen Unterklassen unterschiedliche Parameter für 'Add' haben würden, was würden Sie gewinnen, wenn Sie diese in einer Basisklasse definiert hätten? –

+0

Mögliches Duplikat von [Verwendung von Generika in abstrakten Klassen] (http://stackoverflow.com/questions/2359540/using-generics-in-abstract-classes) – pw94

Antwort

4

Sie können dies tun, wenn ich Sie richtig verstehe:

public abstract class BaseService<T> 
{ 
    public abstract T Get();   
} 

Dann:

public class CategoryService : BaseService<Category> 
{ 
    public override Category Get(){ ... } 
} 

Sie diese Methoden nicht außer Kraft setzen können und haben eine andere Signatur in der Überschreibung, aber man konnte ein verwenden Wörterbuch/hashtable oder etwas mehr Phantasie, um Parameter in die Add Methode zu übergeben. Das Übergeben von Parametern bei der Verwendung eines generischen Containers würde bedeuten, dass Sie beginnen, die Abfrage Muster zu verwenden, wo die Parameter im Container die Abfrage bestimmen (nur für Info :-)).

+0

Genau das habe ich gesucht! Ich ging in diese Richtung aber war nicht 100% sicher ... danke! – amoyer

1

Versuchen generischer Typ mit

public abstract List<T> GetAll<T>(); 

Und Rückkehr entsprechenden Typ in Ihrem Kind Klasse

aktualisieren

@ pw94 Antwort ist auch eine gute Möglichkeit, dies zu erreichen, aber das einzige Problem, Sie können nicht mehrere Typen für verschiedene Methoden verwenden, nur ein Typ funktioniert, sobald Sie die Klasse erben.

0

Sie können abstrakte generische Klasse erstellen:

public abstract class BaseService<T> 
{ 
    public abstract void Add(); 

    public abstract List<T> Get();   
} 

und implementieren:

public class CategoryService : BaseService<int> 
{ 
    public override void Add(){ ... } 

    public override List<int> Get(){ ... } 
} 
Verwandte Themen