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
Antwort
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 ...
Ich muss mit dieser Idee spielen, aber es sieht gut aus. –
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.
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. –
Ü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.
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.
- 1. So erstellen Sie Sammlung (1: n) Relation
- 2. So erstellen Sie eine übergeordnete Elementsammlung mit einer untergeordneten Sammlung
- 3. So erstellen Sie eine Firebase-Sammlung zur Laufzeit mit der Firebase-Sammlung von Polymer
- 4. So erstellen Sie eine parallele Scala-Sammlung aus einer Java-Sammlung
- 5. So erstellen Sie eine Bibliothek
- 6. So erstellen Sie eine GMSPlace
- 7. So erstellen Sie eine Berichtsbibliothek?
- 8. So erstellen Sie eine Beendigungsnachricht
- 9. So erstellen Sie eine Funktion
- 10. So übergeben Sie eine Sammlung/Array-Parameter an eine Aktion
- 11. Keine Route passt für geerbte (erstellen) Aktion
- 12. Erstellen Sie eine Sammlung von Objekten mit Underscore
- 13. So geben Sie eine schreibgeschützte Kopie einer Sammlung zurück
- 14. So präsentieren Sie eine rekursive Sammlung in JSP
- 15. So durchsuchen Sie eine Sammlung mit einem Array in Powershell
- 16. So sortieren Sie eine Sammlung basierend auf einer Untersammlungseigenschaft
- 17. So erstellen Sie eine benutzerdefinierte Observable-Sammlung mit ConcurrentDictionary, INotifyCollectionChanged, INotifyPropertyChanged
- 18. So bearbeiten Sie Elemente in Laravel-Sammlung
- 19. So erstellen Sie eine Fluidhöhe Div?
- 20. So erstellen Sie eine Benachrichtigung im Wechsel
- 21. So erstellen Sie eine Bildlaufliste im Textfeld
- 22. So erstellen Sie eine Konstante in Javascript
- 23. So erstellen Sie eine kreisförmige LinkedList
- 24. So erstellen Sie eine abgerundete Chevron-Form
- 25. So erstellen Sie eine Protokolldatei in SSIS
- 26. So erstellen Sie eine Energieleiste in JavaScript
- 27. So erstellen Sie eine Hintergrundaufgabe Erneut planen
- 28. So erstellen Sie eine horizontale Bildlaufleiste Diashow
- 29. So erstellen Sie eine relativ positionierte Fußzeile
- 30. So erstellen Sie eine Warnungsaktion ohne Titel:
Warum wird eine Methode zum Hinzufügen von Elementen zu einer Sammlung unbrauchbar? Wie sonst stellst du Gegenstände hinein? –
Ist ResultInfo eine abstrakte Basisklasse? – foson