Warum werden abstrakte oder Interface-Klassen erstellt oder wann sollten wir abstrakte oder Interface-Klassen verwenden?Wann abstrakte Klasse oder Schnittstelle zu verwenden?
Antwort
Die Schnittstelle wird verwendet, wenn Sie nur deklarieren wollen, welche Methoden und Member eine Klasse haben MUSS. Jeder, der die Schnittstelle implementiert, muss die von der Schnittstelle aufgelisteten Methoden deklarieren und implementieren.
Wenn Sie auch eine Standardimplementierung verwenden möchten, verwenden Sie die abstrakte Klasse. Jede Klasse, die die abstrakte Klasse erweitert, muss nur ihre abstrakten Methoden und Member implementieren und wird eine Standardimplementierung der anderen Methoden der abstrakten Klasse haben, die Sie überschreiben können oder nicht.
--edit - vergaß zu erwähnen, Earwicker erinnerte mich
Schließlich können Sie so viele Schnittstellen implementieren, wie Sie wollen, aber nur eine Klasse erweitern (es abstrakt ist oder nicht). Denken Sie daran, bevor Sie wählen.
Das ist nicht der grundlegende Unterschied - Sie können eine abstract Klasse erstellen, die nur abstrakte Methoden hat. –
In diesem Fall, warum nicht eine Schnittstelle verwenden? –
Ich habe die Sprache nicht entworfen! :) Sie könnten theoretisch einige geschützte Datenfelder in der abstrakten Klasse haben, die Sie mit einer Schnittstelle nicht machen konnten. –
Eine abstrakte Klasse ist eine Klasse, die einige ihrer Methoden nicht implementiert. Offensichtlich kann es nicht instanziiert werden. Sie müssen von einer abstrakten Klasse erben und die abstrakten Methoden in einer anderen Klasse implementieren.
Schnittstellen sind überhaupt keine Klassen (nennen Sie sie daher nicht Interface-Klasse). Schnittstellen definieren die Signatur von Methoden ohne jegliche Implementierung. Auch Schnittstellen haben keine Member-Felder. Wenn Sie eine Schnittstelle in einer Klasse implementieren, müssen Sie Implementierungen für die von der Schnittstelle bereitgestellten Methoden bereitstellen.
Es ist sinnvoll, eine generalisierte API für einige Dinge zu definieren, die völlig unterschiedliche Implementierungen haben können. Abstrakte Klassen sind nützlicher für Klassen, die hauptsächlich dasselbe tun, aber einige subtile Unterschiede haben. Sie können beide Ansätze kombinieren.
Ein gutes Beispiel ist die collections framework der Java-Klassenbibliothek. Sie haben die Schnittstelle Liste, die definiert, wie sich Listen verhalten müssen. Einige Implementierungen sind zum Beispiel ArrayList und LinkedList. Da sie sich ähnlich verhalten, wird das Zeug, das für beide gleich funktioniert, in der abstrakten Klasse AbstactList implementiert, beide erben dies.
Abstrakte Klassen werden beim Erstellen einer Vererbungshierarchie verwendet. Die meisten Vererbungshierarchien sollten jedoch nicht zu "tief" sein (d. H. Zu viele Vererbungsebenen). Viele objektorientierte Designbücher bevorzugen Schnittstellen über die Vererbung (ein Buch, das ich einmal gelesen habe, hat einen Entwickler zitiert, dass "Vererbung die einzige coolste [objektorientierte] Funktion ist, die du nicht implementierst"), da dadurch Klassen Verhalten zugewiesen werden kann. durch Vertrag ", wo der Vertrag die Schnittstelle ist.
Es ist erwähnenswert Samuelcarijos Antwort - wenn Sie eine Standardimplementierung einer Methode haben möchten, müssten Sie eine abstrakte Klasse verwenden, die eine konkrete Implementierung der Methode hat, um ihr eine Standardimplementierung zu geben. Diese Standardimplementierung kann in untergeordneten Klassen überschrieben werden.
Hoffe, das hilft!
SamuelCarrijo scheint diese Frage gut beantwortet zu haben.
Zusätzlich zu Java erfordern einige Frameworks eine Schnittstelle zum Arbeiten. Ich denke an (sagen wir) dynamic proxies oder einige Client/Server-Proxy-Frameworks. Dies liegt daran, dass sie eine Introspektion für das Objekt verwenden, um Methoden zu bestimmen, die von den durch das Objekt implementierten Schnittstellen implementiert werden. Daher müssen Sie gelegentlich eine Schnittstelle für ein Objekt implementieren, wo Sie normalerweise nicht stören würden.
Hinweis dieser Grund für Schnittstellen ist Java spezifisch.
Der entscheidende Unterschied ist, dass Sie implement
mehrere Schnittstellen in einer Klasse, aber nur extend
eine einzelne abstrakte Klasse. Dies liegt daran, dass eine abstrakte Klasse auch Felder definieren kann, die Daten speichern, während dies bei einer Schnittstelle nicht möglich ist.
Guter Punkt! Daran hatte ich mich nicht erinnert. Java (wie C#) erlaubt keine Mehrfachvererbung von Klassen, erlaubt aber die Implementierung von beliebig vielen Schnittstellen. –
tatsächlich können Sie auch Felder in einer Schnittstelle haben, aber nur wenn sie statisch und final sind – FearlessHyena
Siehe Schnittstelle ist im Grunde ein "Vertrag". Wenn Sie eine Schnittstelle definieren, definieren Sie einen Vertrag. Wo abstrakte Klassen erweitert werden, werden Schnittstellen implementiert.
Betrachten wir ein Beispiel.
public interface Friend {
void hello();
}
Jetzt haben Sie einen Vertrag definiert, die besagt, dass jede Klasse, die Friend
bereitstellen muss eine Definition für Verfahren hello()
implementieren möchte. Hier
ist eine Implementierung:
public class myFriend implements Friend {
public void hello()
println("Done");
}
Jetzt myFriend
hat den Vertrag erfüllt. Jetzt stellt sich die Frage: Wo sollen Interfaces verwendet werden?
Schnittstellen helfen Ihnen, ein Verhalten zu definieren, das implementiert werden muss. Angenommen, Sie haben eine Klasse A, die einige Funktionen definiert. Sie möchten, dass andere Klassen diese Klassenfunktion nur verwenden sollen, wenn sie ein bestimmtes Verhalten (Methoden) definieren. Sie erzwingen diese Einschränkung in Bezug auf die Schnittstelle.
- 1. Abstrakte Klasse oder öffentliche Methode mit Schnittstelle
- 2. Welcher ist schnell, abstrakte Klasse oder Schnittstelle?
- 3. php: Wann abstrakte und Interface-Klasse zu verwenden?
- 4. Abstrakte Klasse und Schnittstelle zusammen?
- 5. Wann das abstrakte Fabrikmuster verwenden?
- 6. Abstrakte Klasse als funktionale Schnittstelle
- 7. abstrakte Klasse implementiert keine Schnittstelle
- 8. reine abstrakte Klasse und Schnittstelle
- 9. Schnittstelle oder abstrakte Klasse zur Erfüllung der Anforderung
- 10. Verwenden Sie statische Klasse oder abstrakte Klasse für die Objekterstellung
- 11. Warum eine leere abstrakte Klasse anstelle einer Schnittstelle verwenden?
- 12. Abstrakte Basisklasse oder Schnittstelle? Weder scheint Recht
- 13. C# -Schnittstelle/Abstrakte Klasse mit dynamischem Typ
- 14. Builder Entwurfsmuster - Keine abstrakte Klasse/Schnittstelle
- 15. abstrakte Klasse definiert, die Beobachter-Schnittstelle
- 16. Java abstrakte Klasse, abstrakte Konstruktor
- 17. Wann ein Modul zu verwenden, und wann eine Klasse
- 18. Was zu verwenden? Parametrisierte Klasse, abstrakte Klasse oder undefinierter Typ in Scala?
- 19. Soll ich eine Schnittstelle für die abstrakte Klasse erstellen?
- 20. In Java, wann sollte ich eine abstrakte Methode in einer Schnittstelle verwenden?
- 21. Nicht sicher, wann eine abstrakte Eigenschaft zu verwenden ist und wann nicht
- 22. Java abstrakte Methode und Schnittstelle
- 23. C# Interface-Vererbung zu Abstrakte Klasse
- 24. Schnittstelle gegen abstrakte Klassen C++
- 25. C++ Abstrakte Klasse Betreiber Überlastung und Schnittstelle Durchsetzung Frage
- 26. eine abstrakte Klasse mit der Basisklasse in Schnittstelle C#
- 27. Klasse vs. Schnittstelle
- 28. Warum RecyclerView.OnScrollListener ist keine Schnittstelle, sondern eine abstrakte Klasse?
- 29. wann elem.style.left oder elem.offsetLeft zu verwenden
- 30. C# -Compiler beschwert sich, dass abstrakte Klasse Schnittstelle nicht implementiert?
möglich Duplikat von [Java abstrakte Klasse und Schnittstelle] (http://stackoverflow.com/questions/5094825/java-abstract-class-and-interface) – duffymo
http://stackoverflow.com/questions/761194/interface -vs-abstract-class-general-oo –
https://stackoverflow.com/questions/479142/when-zu-use-an-interface-instead-of-abstract-class-and-vice-versa enthält am besten Antworten –