Klassenbasierte Programmierung - Class-based programming

Klasse-basierte Programmierung oder häufige Klasse-Orientierung , ist eine Art der objektorientierten Programmierung (OOP) , in der Vererbung über die Definition auftritt Klassen von Objekten , statt Vererbung auftritt über die allein Objekte (vgl Prototyp-basierte Programmierung ).

Das beliebteste und am weitesten entwickelte Modell von OOP ist ein klassenbasiertes Modell anstelle eines objektbasierten Modells. In diesem Modell sind Objekte Entitäten, die Zustand (dh Daten), Verhalten (dh Prozeduren oder Methoden ) und Identität (eindeutige Existenz unter allen anderen Objekten) kombinieren . Die Struktur und das Verhalten eines Objekts werden durch eine Klasse definiert , die eine Definition oder Blaupause aller Objekte eines bestimmten Typs ist. Ein Objekt muss explizit basierend auf einer Klasse erstellt werden und ein so erstelltes Objekt wird als eine Instanz dieser Klasse betrachtet. Ein Objekt ist einer Struktur ähnlich , mit dem Hinzufügen von Methodenzeigern, Memberzugriffskontrolle und einem impliziten Datenmember, der Instanzen der Klasse (dh Objekte der Klasse) in der Klassenhierarchie lokalisiert (wesentlich für Laufzeitvererbungsfunktionen).

Verkapselung

Die Kapselung verhindert, dass Benutzer die Invarianten der Klasse aufbrechen , was nützlich ist, da sie es ermöglicht, die Implementierung einer Klasse von Objekten für Aspekte zu ändern, die in der Schnittstelle nicht verfügbar gemacht werden, ohne den Benutzercode zu beeinträchtigen. Die Definitionen der Kapselung konzentrieren sich eher auf die Gruppierung und Verpackung verwandter Informationen ( Kohäsion ) als auf Sicherheitsaspekte. OOP-Sprachen bieten normalerweise keine formalen Sicherheitseinschränkungen für den internen Objektzustand. Die Verwendung einer Zugriffsmethode ist eine Konvention für das Interface-Design.

Nachlass

Bei der klassenbasierten Programmierung erfolgt die Vererbung , indem neue Klassen als Erweiterungen bestehender Klassen definiert werden: Die vorhandene Klasse ist die Elternklasse und die neue Klasse ist die Kindklasse . Wenn eine untergeordnete Klasse nur eine übergeordnete Klasse hat, wird dies als einfache Vererbung bezeichnet , während eine untergeordnete Klasse mehr als eine übergeordnete Klasse haben kann, wird dies als Mehrfachvererbung bezeichnet . Dadurch werden Klassen in einer Hierarchie organisiert , entweder einem Baum (bei Einfachvererbung) oder Gitter (bei Mehrfachvererbung).

Das definierende Merkmal der Vererbung besteht darin, dass sowohl die Schnittstelle als auch die Implementierung vererbt werden; Wenn nur die Schnittstelle geerbt wird, wird dies als Schnittstellenvererbung oder Subtyping bezeichnet. Die Vererbung kann auch ohne Klassen erfolgen, wie bei der prototypbasierten Programmierung .

Kritik an klassenbasierten Modellen

Klassenbasierte Sprachen, genauer gesagt typisierte Sprachen , bei denen Unterklassen die einzige Möglichkeit zur Untertypisierung sind , wurden dafür kritisiert, dass sie Implementierungen und Schnittstellen durcheinander brachten – das wesentliche Prinzip der objektorientierten Programmierung. Die Kritiker sagen, man könnte eine Bag-Klasse erstellen, die eine Sammlung von Objekten speichert , und sie dann erweitern, um eine neue Klasse namens Set-Klasse zu machen, bei der die Duplizierung von Objekten eliminiert wird. Nun kann eine Funktion, die ein Objekt der Beutelklasse verwendet, erwarten, dass das Hinzufügen von zwei Objekten die Größe eines Beutels um zwei erhöht, aber wenn man ein Objekt einer Satzklasse passiert, kann das Hinzufügen von zwei Objekten die Größe von eine Tasche zu zweit. Das Problem entsteht genau deshalb, weil die Unterklassenbildung eine Untertypisierung selbst in den Fällen impliziert, in denen das Prinzip der Untertypisierung, das als Liskov-Substitutionsprinzip bekannt ist , nicht gilt. Barbara Liskov und Jeannette Wing formulierten das Prinzip in einer Arbeit von 1994 prägnant wie folgt:

Subtyp-Anforderung : Sei eine Eigenschaft, die über Objekte des Typs beweisbar ist . Dann sollte für Objekte des Typs true gelten, wobei ein Untertyp von ist .

Daher muss man normalerweise zwischen Subtyping und Subclassing unterscheiden. Die meisten aktuellen objektorientierten Sprachen unterscheiden Subtyping und Subclassing, einige Designansätze jedoch nicht.

Ein weiteres häufiges Beispiel ist, dass ein aus einer Kindklasse erstelltes Personenobjekt kein Objekt einer Elternklasse werden kann, da eine Kindklasse und eine Elternklasse eine Personenklasse erben, aber klassenbasierte Sprachen erlauben es meistens nicht, die Art der Klasse zu ändern das Objekt zur Laufzeit. Für klassenbasierte Sprachen ist diese Einschränkung wichtig, um den Benutzern eine einheitliche Ansicht der Klasse zu ermöglichen. Die Benutzer sollten sich nicht darum kümmern müssen, ob eine der Implementierungen einer Methode Änderungen verursacht, die die Invarianten der Klasse brechen . Solche Änderungen können vorgenommen werden, indem das Objekt zerstört und an seiner Stelle ein anderes konstruiert wird. Polymorphismus kann die entsprechenden Schnittstellen , auch wenn solche Änderungen durchgeführt erhalten verwendet werden, da die Objekte als Blackbox Abstraktionen und der Zugriff über das Objekt betrachtet werden Identität . Normalerweise wird jedoch der Wert von Objektreferenzen, die sich auf das Objekt beziehen, geändert, was Auswirkungen auf den Clientcode hat.

Beispielsprachen

Obwohl Simula die Klassenabstraktion eingeführt hat, ist Smalltalk das kanonische Beispiel für eine klassenbasierte Sprache . Andere sind PHP , C++ , Java , C# und Objective-C .

Siehe auch

Verweise