840 Stimmen

Schnittstelle vs. Basisklasse

Wann sollte ich eine Schnittstelle und wann eine Basisklasse verwenden?

Sollte es immer eine Schnittstelle sein, wenn ich keine Basisimplementierung der Methoden definieren möchte?

Wenn ich eine Hunde- und Katzenklasse habe. Warum sollte ich IPet anstelle von PetBase implementieren wollen? Ich kann verstehen, mit Schnittstellen für ISheds oder IBarks (IMakesNoise?), weil diese auf ein Haustier von Haustier Basis platziert werden können, aber ich verstehe nicht, welche für eine allgemeine Pet verwenden.

11 Stimmen

Nur ein Punkt, den Sie meiner Meinung nach berücksichtigen sollten - Schnittstellen können verschiedene Einschränkungen mit sich bringen, derer Sie sich möglicherweise erst in sehr späten Phasen bewusst sind. Zum Beispiel mit .NET können Sie nicht serialisieren eine Schnittstelle Mitglied Variable, so dass, wenn Sie eine Klasse Zoo und ein Mitglied Variable Array von IAnimals haben Sie nicht in der Lage, Zoo serialisieren (und das bedeutet, schreiben WebServices oder andere Dinge, die eine Serialisierung wäre ein Schmerz).

2 Stimmen

Diese Frage könnte helfen, das Konzept der Schnittstellen zu verstehen. stackoverflow.com/q/8531292/1055241

0 Stimmen

Ich bin nur neugierig. Ich traf in der CLR über C# den folgenden Auszug: I tend to prefer using the interface technique over the base type technique because the base type technique doesn’t allow the developer to choose the base type that works best in a particular situation. . Ich kann nicht begreifen, was in dem Auszug gemeint ist. Wir können einige Basistypen erstellen und für jeden von ihnen einen abgeleiteten Typ erstellen, so dass ein Entwickler einen Basistyp auswählen kann. Könnte mir bitte jemand erklären, was ich übersehe? Ich glaube, es kann ein Teil dieser Frage sein. Oder sollte ich eine andere Frage zu dem spezifischen Auszug stellen?

2voto

Definitionsgemäß bietet eine Schnittstelle eine Ebene zur Kommunikation mit anderem Code. Alle öffentlichen Eigenschaften und Methoden einer Klasse implementieren standardmäßig eine implizite Schnittstelle. Wir können eine Schnittstelle auch als eine Rolle definieren. Wenn eine Klasse diese Rolle spielen muss, muss sie sie implementieren, wobei sie je nach implementierender Klasse unterschiedliche Formen der Implementierung erhält. Wenn man also von einer Schnittstelle spricht, spricht man von Polymorphismus und wenn man von einer Basisklasse spricht, spricht man von Vererbung. Zwei Konzepte von oops !!!

2voto

Bill the Lizard Punkte 384619

Normalerweise setze ich beides nicht ein, bis ich es brauche. Ich bevorzuge Schnittstellen gegenüber abstrakten Klassen, weil das ein wenig mehr Flexibilität bietet. Wenn es ein gemeinsames Verhalten in einigen der vererbenden Klassen gibt, ziehe ich das vor und mache eine abstrakte Basisklasse. Ich sehe keine Notwendigkeit für beides, da sie im Wesentlichen den gleichen Zweck erfüllen, und beides zu haben, ist ein schlechter Codegeruch (imho), der darauf hindeutet, dass die Lösung überentwickelt wurde.

2voto

spoulson Punkte 20898

Das hängt von Ihren Anforderungen ab. Wenn IPet einfach genug ist, würde ich es vorziehen, es zu implementieren. Andernfalls, wenn PetBase implementiert eine Tonne von Funktionalität, die Sie nicht wollen, zu duplizieren, dann haben an ihm.

Der Nachteil bei der Implementierung einer Basisklasse ist die Anforderung, dass override (oder new ) bestehende Methoden. Dadurch werden sie zu virtuellen Methoden, was bedeutet, dass Sie vorsichtig sein müssen, wie Sie die Objektinstanz verwenden.

Und schließlich bringt mich die Einfachvererbung von .NET um. Ein naives Beispiel: Nehmen wir an, Sie erstellen ein Benutzersteuerelement, also erben Sie UserControl . Aber jetzt ist es Ihnen verwehrt, auch zu erben PetBase . Dies zwingt Sie zu einer Umstrukturierung, z. B. um eine PetBase Klassenmitglied, stattdessen.

1voto

sunwukung Punkte 2685

Verwenden Sie Schnittstellen, um einen Vertrag ÜBER Familien von nicht verwandten Klassen hinweg durchzusetzen. So können Sie z.B. gemeinsame Zugriffsmethoden für Klassen haben, die Sammlungen darstellen, aber völlig unterschiedliche Daten enthalten, d.h. eine Klasse könnte eine Ergebnismenge aus einer Abfrage darstellen, während die andere die Bilder in einer Galerie repräsentieren könnte. Außerdem können Sie mehrere Schnittstellen implementieren und so die Fähigkeiten der Klasse mischen (und kennzeichnen).

Verwenden Sie die Vererbung, wenn die Klassen in einer gemeinsamen Beziehung zueinander stehen und daher eine ähnliche Struktur- und Verhaltenssignatur aufweisen, d.h. Auto, Motorrad, Lkw und Geländewagen sind alle Arten von Straßenfahrzeugen, die eine bestimmte Anzahl von Rädern, eine Höchstgeschwindigkeit

1voto

Aaron Fischer Punkte 20373

Ein Erbe einer Basisklasse sollte eine "is a"-Beziehung haben. Eine Schnittstelle stellt eine "implementiert eine"-Beziehung dar. Verwenden Sie also nur dann eine Basisklasse, wenn Ihre Erben die Beziehung "is a" beibehalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X