Klassen mit Sammlungen als Eigenschaften im Vergleich zu Klassen, die Sammlungen verwalten

8

Vor kurzem habe ich eine Klasse verwendet, die von einer Sammlung erbt, anstatt die Sammlung in der Klasse instanziiert zu haben, ist das akzeptabel oder schafft sie in der Zukunft unsichtbare Probleme? Zur Verdeutlichung Beispiele unten:

%Vor%

anstelle von etwas wie:

%Vor%

Irgendwelche Gedanken?

    
wwilkins 08.12.2008, 15:44
quelle

6 Antworten

10

Das Problem dabei ist, dass Ihre Cars-Klasse immer noch über die Schnittstelle verfügt, die sie von List erbt, was Operationen ermöglichen kann, die Sie nicht wollen.

    
Michael Borgwardt 08.12.2008, 15:52
quelle
6

Das hängt vom endgültigen Zweck Ihrer Klasse ab. Wenn es nur als eigene Implementierung einer Sammlung funktionieren soll, verwenden Sie die Vererbung. Wenn nicht, fügen Sie eine Sammlung als Eigenschaft hinzu. Die zweite Option ist vielseitiger:

  • Da Sie nur von einer Klasse erben können, müssen Sie möglicherweise eine andere Klasse als die Sammlung
  • erben
  • Wenn Sie diese Klasse als Sammlung sehen möchten, können Sie eine Indexer-Eigenschaft hinzufügen.
Igor Zelaya 08.12.2008 15:53
quelle
4

Ich habe die Frage vorher falsch gelesen.

Ich würde vorschlagen, Komposition anstelle von Vererbung zu verwenden. Wenn Sie in der Lage sein möchten, alle funkigen LINQ-Sachen zu verwenden, implementieren Sie auf jeden Fall IEnumerable<T> und vielleicht sogar IList<T> - aber ich würde nicht direkt von List<T> ableiten.

Wenn Sie tun möchten, dass die Collection-Dateien "kostenlos" abgerufen werden, aber immer noch die Kontrolle behalten, können Sie CollectionBase . Das bindet Sie immer noch in Bezug auf Ihre einzige Chance auf Vererbung, aber zumindest haben Sie mehr Kontrolle darüber, was in der Sammlung passiert.

    
Jon Skeet 08.12.2008 15:58
quelle
3

Wenn Sie möchten, dass Ihre Cars-Klasse genau wie eine Liste agiert und die gleichen Methoden verwendet, ist das gar nicht so schlecht. Sie stammen nur davon ab und Sie sind fertig. Wenn Sie dann zusätzliche Funktionen hinzufügen möchten, können Sie diese Methoden einfach deklarieren, und Sie sind fertig. Sie sind jetzt jedoch an List gebunden und wenn List sich auf unerwünschte Weise ändert, sind Sie verrückt.

Wenn Sie stattdessen eine zusammengesetzte Klasse erstellen und die Liste in der Klasse instanziiert haben, müssen Sie nur die Methoden von List offen legen, die Sie verfügbar machen möchten. Aber das bedeutet, dass du sie alle wiederholen musst.

    
Mike Hall 08.12.2008 15:59
quelle
3

Wenn der Zweck der Klasse darin besteht, einer Standardsammlung zusätzliche Funktionalität hinzuzufügen, würde ich von der Sammlung erben. Wenn die Sammlung nur ein Teil eines größeren Bildes ist, dann klingt das eher nach einer Eigenschaft.

Ich würde jedoch die Verwendung von Collection & lt; T & gt; anstelle von List & lt; T & gt; es sei denn, Sie benötigen wirklich die Funktionalität in List & lt; T & gt;.

    
Jon B 08.12.2008 16:14
quelle
1

Wird die Klasse "Autos" wirklich benötigt? Hat etwas mehr Funktionalität als "Liste"? Wenn nicht, sollten Sie "List" (oder besser "IList") verwenden.

Wenn die Klasse "Autos" zusätzliche Funktionalität hat, gibt es zwei Hauptszenarien:

  • Diese Klasse ist "final" Klasse, es gibt keine große Möglichkeit, die jemand anderen braucht es zu erweitern. Dann ist diese Konstruktion OK.
  • Diese Klasse wird wahrscheinlich als Basisklasse verwendet. Dann empfehle ich diese Konstruktion zu verwenden:

.

%Vor%

Wenn Sie in Zukunft flexibler sein wollen, sollten Sie eine Komposition verwenden:

%Vor%     
TcKs 08.12.2008 17:32
quelle

Tags und Links