Wann sollte ich eine Schnittstelle und wann eine Basisklasse verwenden?
Sie sollten Interface verwenden, wenn
- Sie haben reine
abstract
Methoden und haben keine nicht-abstrakten Methoden
- Sie haben keine Standardimplementierung von
non abstract
Methoden (außer in Java 8, wo Schnittstellenmethoden eine Standardimplementierung bieten)
- Wenn Sie Java 8 verwenden, bietet die Schnittstelle jetzt eine Standardimplementierung für einige nicht-abstrakte Methoden. Dies macht
interface
besser nutzbar im Vergleich zu abstract
Klassen.
Werfen Sie einen Blick auf diese SE Frage für weitere Einzelheiten.
Sollte es immer eine Schnittstelle sein, wenn ich keine Basisimplementierung der Methoden definieren möchte?
Ja, es ist besser und sauberer. Selbst wenn Sie eine Basisklasse mit einigen abstrakten Methoden haben, lassen Sie die Basisklasse erweitert abstract
Methoden über die Schnittstelle. Sie können die Schnittstelle in Zukunft ändern, ohne die Basisklasse zu ändern.
Beispiel in java:
abstract class PetBase implements IPet {
// Add all abstract methods in IPet interface and keep base class clean.
Base class will contain only non abstract methods and static methods.
}
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.
Ich ziehe es vor, dass die Basisklasse die Schnittstelle implementiert.
abstract class PetBase implements IPet {
// Add all abstract methods in IPet
}
/*If ISheds,IBarks is common for Pets, your PetBase can implement ISheds,IBarks.
Respective implementations of PetBase can change the behaviour in their concrete classes*/
abstract class PetBase implements IPet,ISheds,IBarks {
// Add all abstract methods in respective interfaces
}
Vorteile:
-
Wenn ich eine weitere abstrakte Methode in bestehende Schnittstellen einfügen möchte, ändere ich einfach die Schnittstelle, ohne die abstrakte Basisklasse zu berühren. Wenn ich den Vertrag ändern möchte, ändere ich die Schnittstelle und die Implementierungsklassen, ohne die Basisklasse zu berühren.
-
Sie können der Basisklasse über die Schnittstelle Unveränderlichkeit verleihen. Schauen Sie sich dies an Artikel
Weitere Einzelheiten finden Sie in dieser verwandten SE-Frage:
Wie hätte ich den Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse erklären sollen?
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?