abstractclass und interface sind zwei Mechanismen in der Java-Sprache, die abstrakte Klassendefinitionen unterstützen. Gerade aufgrund der Existenz dieser beiden Mechanismen erhält Java leistungsstarke objektorientierte Fähigkeiten. Es gibt große Ähnlichkeiten zwischen abstrakter Klasse und Schnittstelle hinsichtlich der Unterstützung der Definition abstrakter Klassen und sie können sogar untereinander ersetzt werden. Daher scheinen viele Entwickler bei der Definition abstrakter Klassen eher locker mit der Wahl von abstrakter Klasse und Schnittstelle umzugehen. Tatsächlich gibt es immer noch einen großen Unterschied zwischen den beiden. Ihre Wahl spiegelt sogar das Verständnis der Natur des Problembereichs wider und ob das Verständnis der Entwurfsabsicht richtig und vernünftig ist. In diesem Artikel werden die Unterschiede zwischen ihnen analysiert und versucht, Entwicklern eine Grundlage für die Wahl zwischen den beiden zu bieten.
Abstrakte Klassen verstehen
Abstractclass und Schnittstelle werden beide verwendet, um abstrakte Klassen in der Java-Sprache zu erstellen (die abstrakte Klasse in diesem Artikel ist nicht von abstractclass übersetzt, sie stellt einen abstrakten Körper dar, und abstractclass ist eine Methode zum Definieren abstrakter Klassen in der Java-Sprache), Leser Bitte achten Sie auf die Unterscheidung der Definition. Was ist dann eine abstrakte Klasse und welche Vorteile kann uns die Verwendung abstrakter Klassen bringen?
Im objektorientierten Konzept wissen wir, dass alle Objekte durch Klassen dargestellt werden, aber das Gegenteil ist nicht der Fall. Nicht alle Klassen werden zur Beschreibung von Objekten verwendet. Wenn eine Klasse nicht genügend Informationen zur Beschreibung eines bestimmten Objekts enthält, ist eine solche Klasse eine abstrakte Klasse. Abstrakte Klassen werden oft verwendet, um abstrakte Konzepte darzustellen, die wir aus der Analyse und Gestaltung von Problembereichen ableiten. Sie sind Abstraktionen einer Reihe spezifischer Konzepte, die unterschiedlich aussehen, aber im Wesentlichen gleich sind. Wenn wir beispielsweise eine Grafikbearbeitungssoftware entwickeln, werden wir feststellen, dass es im Problembereich einige spezifische Konzepte gibt, die unterschiedlich sind, aber alle zum Konzept der Form gehören Im Problembereich handelt es sich um ein abstraktes Konzept. Gerade weil abstrakte Konzepte keine entsprechenden konkreten Konzepte im Problembereich haben, können die zur Darstellung abstrakter Konzepte verwendeten abstrakten Klassen nicht instanziiert werden.
Im objektorientierten Bereich werden abstrakte Klassen hauptsächlich zum Verstecken von Typen verwendet. Wir können eine abstrakte Beschreibung eines festen Satzes von Verhaltensweisen konstruieren, aber dieser Satz von Verhaltensweisen kann beliebig viele mögliche konkrete Implementierungen haben. Diese abstrakte Beschreibung ist die abstrakte Klasse, und diese Menge aller möglichen konkreten Implementierungen wird durch alle möglichen abgeleiteten Klassen repräsentiert. Module können auf einem abstrakten Körper arbeiten. Da ein Modul auf einer festen Abstraktion basiert, kann es nicht gleichzeitig geändert werden. Das Verhalten dieses Moduls kann auch durch Ableitung von dieser Abstraktion erweitert werden. Leser, die mit OCP vertraut sind, müssen wissen, dass abstrakte Klassen der Schlüssel sind, um OCP (Open-ClosedPrinciple), eines der Kernprinzipien des objektorientierten Designs, zu realisieren.
Betrachten Sie abstrakte Klassen und Schnittstellen auf der Ebene der grammatikalischen Definition
Auf grammatikalischer Ebene bietet die Java-Sprache unterschiedliche Definitionen für abstrakte Klassen und Schnittstellen. Das Folgende ist ein Beispiel für die Definition einer abstrakten Klasse namens Demo, um diesen Unterschied zu veranschaulichen.
Die Methode zum Definieren der abstrakten Demo-Klasse mithilfe von abstractclass ist wie folgt:
Aus Programmiersicht können sowohl abstrakte Klassen als auch Schnittstellen verwendet werden, um die Idee von „DesignbyContract“ umzusetzen. Es gibt jedoch immer noch einige Unterschiede in der spezifischen Verwendung.
Erstens stellt die abstrakte Klasse eine Vererbungsbeziehung in der Java-Sprache dar, und eine Klasse kann die Vererbungsbeziehung nur einmal verwenden. Eine Klasse kann jedoch mehrere Schnittstellen implementieren. Vielleicht ist dies eine Kompromissüberlegung der Entwickler der Java-Sprache, wenn sie die Unterstützung von Mehrfachvererbung durch Java in Betracht ziehen.
Zweitens können wir in der Definition von abstractclass das Standardverhalten der Methode zuweisen. Bei der Definition der Schnittstelle können Methoden jedoch kein Standardverhalten aufweisen. Um diese Einschränkung zu umgehen, müssen Delegaten verwendet werden. Dies erhöht jedoch die Komplexität und verursacht manchmal große Probleme.
Es besteht ein weiteres ernstes Problem darin, dass das Standardverhalten in einer abstrakten Klasse nicht definiert werden kann, da dies zu Wartungsproblemen führen kann. Denn wenn Sie später die Schnittstelle der Klasse (normalerweise dargestellt durch abstractclass oder interface) ändern möchten, um sie an neue Situationen anzupassen (z. B. neue Methoden hinzufügen oder neue Parameter zu vorhandenen Methoden hinzufügen), ist dies sehr problematisch und kann möglicherweise der Fall sein Es nimmt viel Zeit in Anspruch (insbesondere, wenn es viele abgeleitete Klassen gibt). Wenn die Schnittstelle jedoch über Abstractclass implementiert wird, müssen Sie möglicherweise nur das in Abstractclass definierte Standardverhalten ändern.
Wenn das Standardverhalten in einer abstrakten Klasse nicht definiert werden kann, erscheint in ähnlicher Weise dieselbe Methodenimplementierung in jeder abgeleiteten Klasse der abstrakten Klasse, was gegen das Prinzip „Eine Regel, ein Ort“ verstößt, was zu einer Codeduplizierung führt, was ebenfalls nicht förderlich ist zur zukünftigen Wartung. Seien Sie daher bei der Wahl zwischen abstrakter Klasse und Schnittstelle sehr vorsichtig.
Betrachtet man die abstrakte Klasse und die Schnittstelle aus der Perspektive des Designkonzepts, werden oben hauptsächlich die Unterschiede zwischen der abstrakten Klasse und der Schnittstelle aus der Perspektive der grammatikalischen Definition und Programmierung erörtert. Die Unterschiede auf diesen Ebenen sind relativ gering und nicht wesentlich. In diesem Abschnitt wird der Unterschied zwischen abstrakter Klasse und Schnittstelle auf einer anderen Ebene analysiert: den Designkonzepten, die sich in den beiden widerspiegeln. Der Autor glaubt das