Vererbung
Betrachten Sie ein Auto und einen Bus. Sie sind zwei verschiedene Fahrzeuge. Trotzdem haben sie einige gemeinsame Eigenschaften wie Lenkung, Bremsen, Getriebe, Motor usw.
Mit dem Vererbungskonzept kann dies wie folgt dargestellt werden ...
public class Vehicle {
private Driver driver;
private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
//You can define as many properties as you want here ...
}
Jetzt ein Fahrrad ...
public class Bicycle extends Vehicle {
//You define properties which are unique to bicycles here ...
private Pedal pedal;
}
Und ein Auto ...
public class Car extends Vehicle {
private Engine engine;
private Door[] doors;
}
Das ist alles über Vererbung . Wir verwenden sie, um Objekte in einfachere Basisformen und ihre Kinder zu klassifizieren, wie wir oben gesehen haben.
Abstrakte Klassen
Abstrakte Klassen sind unvollständige Objekte. Um es besser zu verstehen, betrachten wir noch einmal die Fahrzeuganalogie.
Ein Fahrzeug kann gefahren werden. Recht? Aber verschiedene Fahrzeuge werden auf unterschiedliche Weise gefahren ... Zum Beispiel können Sie ein Auto nicht so fahren, wie Sie ein Fahrrad fahren.
Wie kann man also die Antriebsfunktion eines Fahrzeugs darstellen? Es ist schwieriger zu überprüfen, um welchen Fahrzeugtyp es sich handelt, und es mit einer eigenen Funktion zu fahren. Sie müssten die Fahrerklasse immer wieder ändern, wenn Sie einen neuen Fahrzeugtyp hinzufügen.
Hier kommt die Rolle abstrakter Klassen und Methoden. Sie können die Laufwerksmethode als abstrakt definieren, um anzugeben, dass alle ererbenden untergeordneten Elemente diese Funktion implementieren müssen.
Also, wenn Sie die Fahrzeugklasse ändern ...
//......Code of Vehicle Class
abstract public void drive();
//.....Code continues
Das Fahrrad und das Auto müssen auch angeben, wie es zu fahren ist. Andernfalls wird der Code nicht kompiliert und es wird ein Fehler ausgegeben.
Kurz gesagt ... eine abstrakte Klasse ist eine teilweise unvollständige Klasse mit einigen unvollständigen Funktionen, die die ererbenden Kinder selbst angeben müssen.
Schnittstellen
Schnittstellen sind völlig unvollständig. Sie haben keine Eigenschaften. Sie zeigen nur an, dass die erbenden Kinder in der Lage sind, etwas zu tun ...
Angenommen, Sie haben verschiedene Arten von Mobiltelefonen bei sich. Jeder von ihnen hat verschiedene Möglichkeiten, verschiedene Funktionen auszuführen. Beispiel: Rufen Sie eine Person an. Der Hersteller des Telefons gibt an, wie es geht. Hier können die Mobiltelefone eine Nummer wählen - das heißt, sie können gewählt werden. Stellen wir dies als Schnittstelle dar.
public interface Dialable {
public void dial(Number n);
}
Hier definiert der Hersteller des Wählbaren, wie eine Nummer gewählt wird. Sie müssen ihm nur eine Nummer zum Wählen geben.
// Makers define how exactly dialable work inside.
Dialable PHONE1 = new Dialable() {
public void dial(Number n) {
//Do the phone1's own way to dial a number
}
}
Dialable PHONE2 = new Dialable() {
public void dial(Number n) {
//Do the phone2's own way to dial a number
}
}
//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE1;
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
Bei der Verwendung von Schnittstellen anstelle von abstrakten Klassen muss sich der Verfasser der Funktion, die ein Wählbares verwendet, nicht um seine Eigenschaften kümmern. Beispiel: Hat es einen Touchscreen oder eine Wähltastatur? Ist es ein Festnetztelefon oder ein Mobiltelefon? Sie müssen nur wissen, ob es wählbar ist. erbt (oder implementiert) es die wählbare Schnittstelle?
Und was noch wichtiger ist , wenn Sie eines Tages die Wählscheibe gegen eine andere austauschen
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
Sie können sicher sein, dass der Code immer noch einwandfrei funktioniert, da die Funktion, die das Wählbare verwendet, nicht (und nicht) von anderen als den in der Wählschnittstelle angegebenen Details abhängt. Beide implementieren eine wählbare Schnittstelle und das ist das einzige, was die Funktion interessiert.
Schnittstellen werden häufig von Entwicklern verwendet, um die Interoperabilität (austauschbare Verwendung) zwischen Objekten sicherzustellen, sofern diese eine gemeinsame Funktion haben (genau wie Sie zu einem Festnetz- oder Mobiltelefon wechseln können, sofern Sie nur eine Nummer wählen müssen). Kurz gesagt, Schnittstellen sind eine viel einfachere Version von abstrakten Klassen ohne Eigenschaften.
Beachten Sie außerdem, dass Sie so viele Schnittstellen implementieren (erben) können, wie Sie möchten, aber nur eine einzelne übergeordnete Klasse erweitern (erben) dürfen.
Weitere Info
Abstract Klassen vs Interfaces