Generische Typen vs Abstrakte Klassen/Interfaces
Angenommen, wir erstellen eine generische Kontrolle in .NET. E. g. ein Baum ist.
Ich verstehe nicht, warum Menschen nutzen diese generische Typdefinition
Control<T>
wenn in der Objekt-Orientierten Programmierung, die ich verwenden kann eine abstrakte Klasse oder ein interface:
Control<IItem> or Control<BaseClass>
Also das einzige, was zu tun ist, dass Ihre Typen müssen eine Ableitung dieser Basisklasse oder die Umsetzung des
- Schnittstelle.
Bedeutet es, dass generische Typen sind bequemer, weil Sie ich habe nicht zu implementieren oder Erben nichts?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass Sie ein wenig verwirrt. Generische Typen und abstrakte Klassen/interfaces dienen unterschiedlichen Zielen für verschiedene Ansätze beim design von Anwendungen. Abstrakte Klassen/interfaces sind für die Generalisierung von gemeinsamer Funktionalität einer Gruppe von Entitäten. Weiter unten auf dieser API umgesetzt werden könnte anders sein, aber da Polymorphismus beteiligt ist, wird es keine Auswirkungen jeder.
Auf der anderen Seite, manchmal hat man eine sehr ähnliche Umsetzung von etwas, und der einzige Unterschied ist der Typ der Objekte, mit der Sie arbeiten. Hier müssen Sie eine generische. Sie verwenden könnte, Polymorphismus, aber es gibt keine Notwendigkeit. Für diesen Zweck ist es viel klarer, nur zur Definition einer Schnittstelle eine Implementierung, und lassen Sie die end-user entscheiden, welche Art von Objekt verwenden.
Das beste Beispiel ist die Liste, wo der Hauptzweck der Liste ist zum speichern von Elementen. Die List-Implementierung nicht darum kümmern sollten, welche Art von Objekten, die Sie verwenden werden, so dass später werden Sie in der Lage sein, genau zu definieren, Liste und nutzen Sie die integer-Liste.
Weil in Ihrem Fall von einem tree control, die Definition eines generischen Baum Steuern würde bedeuten, dass die Tree-Elemente beliebigen Typs sein können (Sie können auch bestimmte Einschränkungen).
Beim instanziieren einer Kontrolle, Sie würde natürlich erklären sich mit den item-Typ (wie in deinem zweiten code-Beispiele mit
IItem
undBaseClass
).Wenn Ihr Steuerelement wäre nicht ein generischer Typ, den Sie erstellen müssen mehrere Steuerelemente für jeden Element-Typ.
Warum nicht einfach eine Schnittstelle/abstractBase geben?
Wenn du nur eine Schnittstelle/abstrakte als Ihr Element konkreten Klasse, Sie würde eingeschränkt werden, indem es die definition. Sie würden nur sehen, dass es Eigenschaften und Methoden. Mit generic Tree control und was auch immer Element geben, du bist immer noch in der Lage, Zugriff auf alle Element-Eigenschaften und-Methoden-unabhängig von Ihrer Schnittstelle mit der Umsetzung oder der übergeordneten Klasse Vererbung...
where T : struct
), oder ein Referenz-Typ (where T : class
), oder, dass es einen default-Konstruktor (where T : new()
)