Schnittstellen können zum Definieren von Verhaltensverträgen verwendet werden und dienen auch als Verträge für die Interaktion zwischen zwei Systemen, während abstrakte Klassen hauptsächlich zum Definieren von Standardverhalten für Unterklassen verwendet werden, was bedeutet, dass alle Unterklassen dieselbe Funktion ausführen sollten.
Wann sollte eine abstrakte Klasse verwendet werden?
- Wenn wir das Konzept der Vererbung verwenden, ist die abstrakte Klasse eine gute Wahl, da sie eine gemeinsame Basisklassenimplementierung für abgeleitete Klassen bereitstellt.
- Wenn wir nicht öffentliche Mitglieder deklarieren möchten, sind abstrakte Klassen ebenfalls eine gute Wahl. In einer Schnittstelle müssen alle Methoden öffentlich sein.
- Wenn wir in Zukunft neue Methoden hinzufügen möchten, sind abstrakte Klassen die bessere Wahl. Denn wenn wir einer Schnittstelle eine neue Methode hinzufügen, müssen alle Klassen, die die Schnittstelle bereits implementieren, geändert werden, um die neue Methode zu implementieren.
- Wenn wir mehrere Versionen unserer Komponente erstellen möchten, können wir eine abstrakte Klasse erstellen. Abstrakte Klassen bieten eine benutzerfreundliche Möglichkeit, Komponenten zu versionieren. Durch die Aktualisierung der Basisklasse werden alle geerbten Klassen automatisch aktualisiert. Sobald die Schnittstelle erstellt ist, kann sie nicht mehr geändert werden. Wird eine neue Version einer Schnittstelle benötigt, muss eine komplett neue Schnittstelle erstellt werden.
- Abstrakte Klassen haben eine bessere Vorwärtskompatibilität. Sobald ein Client eine Schnittstelle verwendet, können wir sie nicht ändern. Wenn er eine abstrakte Klasse verwendet, können wir dennoch Verhalten hinzufügen, ohne den vorhandenen Code zu beschädigen.
- Wenn wir allen Implementierungen unserer Komponente eine gemeinsame implementierte Funktionalität bereitstellen möchten, können wir abstrakte Klassen verwenden. Abstrakte Klassen ermöglichen es uns, die Klasse teilweise zu implementieren, während Schnittstellen keine Implementierung von Mitgliedern enthalten.
Beispiel
abstract class Car {
public void accelerate() {
System.out.println("Do something to accelerate");
}
public void applyBrakes() {
System.out.println("Do something to apply brakes");
}
public abstract void changeGears();
}
Jetzt muss jedes Auto, das Sie instanziieren möchten, die Methode changeGears() implementieren.
class Alto extends Car {
public void changeGears() {
System.out.println("Implement changeGears() method for Alto Car");
}
}
class Santro extends Car {
public void changeGears() {
System.out.println("Implement changeGears() method for Santro Car");
}
}
Wann werden Schnittstellen verwendet?
- Wenn die von uns erstellte Funktionalität für sehr unterschiedliche Objekte verwendet werden soll, verwenden Sie Schnittstellen. Abstrakte Klassen werden hauptsächlich für eng verwandte Objekte verwendet, während Schnittstellen am besten dafür geeignet sind, nicht verwandten Klassen gemeinsame Funktionalität bereitzustellen.
- Schnittstellen sind eine gute Wahl, wenn wir glauben, dass sich die API über einen längeren Zeitraum nicht ändern wird.
- Wenn wir eine Funktionalität ähnlich der Mehrfachvererbung wünschen, sind Schnittstellen ebenfalls eine gute Wahl, da wir mehrere Schnittstellen implementieren können.
- Wenn wir ein kleines und prägnantes Funktionsmodul entwerfen, verwenden wir Schnittstellen. Wenn wir eine große Funktionseinheit entwerfen, verwenden Sie abstrakte Klassen.
Beispiel
public interface Actor {
void perform();
}
public interface Producer {
void invest();
}
Heutzutage sind die meisten Schauspieler reich genug, um ihre eigenen Filme zu machen. Wenn wir Schnittstellen anstelle abstrakter Klassen verwenden, können wir sowohl Actor als auch Producer implementieren. Darüber hinaus können wir auch eine neue ActorProducer-Schnittstelle definieren, die beides erbt.
public interface ActorProducer extends Actor, Producer{
// some statements
}
Das obige ist der detaillierte Inhalt vonWann sollte eine abstrakte Klasse und wann eine Schnittstelle in Java verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!