2009-02-27 15 views
0

Ich schreibe ein Programm in C#, das eine benutzerdefinierte Sammlung enthält. Die benutzerdefinierte Sammlung führt einige nützliche Aggregatfunktionen (AllSuccessful,% Successful, usw.) über ihre Member vom Typ ResultInfo aus. Ich habe mehrere Klassen, die von ResultInfo (UploadResultInfo, XUploadResultInfo und YUploadResultInfo) abgeleitet sind und zusätzliche Auflistungen haben möchten, die von ResultInfoCollection erben, die zusätzliche Aggregatfunktionen haben. Das einzige Problem dabei ist, dass es einen unbrauchbaren Wert auf der Sammlung hinterlässt. Erläuterung: Diese Methode verwendet ein Argument vom Typ ResultInfo, aber eine ResultInfo, die einer UploadResultInfoCollection hinzugefügt wurde, löst einen Fehler aus. Gibt es eine elegante Art, mein Problem zu lösen? Ich habe über Generika nachgedacht, aber ich weiß nicht genau, wie das funktionieren würde.So erstellen Sie eine geerbte Sammlung

+0

Warum wird eine Methode zum Hinzufügen von Elementen zu einer Sammlung unbrauchbar? Wie sonst stellst du Gegenstände hinein? –

+0

Ist ResultInfo eine abstrakte Basisklasse? – foson

Antwort

2

Um eine generische Klasse zu definieren, die jedes Kind von result behandelt man es genau wie

public class MyCollection<T> : ICollection<T> 
where T : ResultInfo 
{ 

    ... the required methods ... just use "T" instead of "ResultInfo" ... 

    public void Add(T item) {} 
} 

Später definieren auf Sie es von

MyCollection<FooResultInfo> coll = new MyCollection<FooResultInfo>(); 

nur versuchen, sie mit nutzen können, sind sie nicht zu schwierig und das Lernen ist dabei der beste Weg ...

+0

Ich muss mit dieser Idee spielen, aber es sieht gut aus. –

0

Ich bin mir nicht sicher, wie Sie mit einer sinnlosen Add-Methode verlassen werden.

Wenn sich die Sammlung selbst füllt, können Sie die Methode Add privat machen.

Wenn Sie möchten, dass Ihre "geerbten" zusätzlichen Sammlungen die Add-Methode nicht verfügbar machen, verwenden Sie Komposition statt Vererbung.

+0

Die Add-Methode im Allgemeinen ist nicht nutzlos. Aber ich möchte nicht, dass sie eine ResultInfo in eine UploadResultInfoCollection einfügen, sodass in vielen Fällen diese öffentliche Lücke Add (ResultInfo ri) Fehler auslöst. –

0

Überlegen Sie, ob Ihre nützlichen Methoden tatsächlich Instanzmethoden sein müssen.

Müssen sie den Status beibehalten, wenn andere Operationen stattfinden, oder sind sie alle mithilfe der öffentlich verfügbaren API (oder intern verfügbar) möglich?

Wenn ja, dann machen Sie sie einfach statische Methoden (Erweiterung Methoden ist wahrscheinlich eine gute Idee) und sorgen Sie sich nicht um Vererbung. Wenn die Methoden auf IEnumerable <T> sinnvoll sind, dann umso besser, indem Sie dies tun, machen Sie Ihre Utility-Funktionen erheblich brauchbarer und damit nützlich.

Die Verwendung des resultierenden Funktionspakets erfordert lediglich den Import des relevanten Namespace.

0

Wenn Sie lediglich einen anderen vorhandenen Auflistungstyp mit zusätzlichen Methoden ausstatten möchten, sollten Sie einfach Erweiterungsmethoden für diesen Typ definieren und eine normale generische Auflistung verwenden.

Verwandte Themen