Klasse (Computerprogrammierung)

Im Objekt orientierte Programmierung, a Klasse ist eine erweiterbare Programmcode-Template für das Erstellen Objekte, Bereitstellung von Anfangswerten für den Zustand (Mitgliedsvariablen) und Implementierungen von Verhalten (Mitgliederfunktionen oder Methoden).[1][2] In vielen Sprachen wird der Klassenname als Name für die Klasse (die Vorlage selbst) verwendet, der Name für den Standard Konstrukteur der Klasse (a Subroutine das schafft Objekte) und als das Typ von Objekten, die erzeugt durch Instantiating die Klasse; Diese unterschiedlichen Konzepte lassen sich leicht miteinander verbinden.[2] Obwohl man bis zum Verschmelzung argumentieren könnte, ist dies ein Merkmal, das einer Sprache aufgrund ihrer polymorphen Natur inhärent ist und warum diese Sprachen so mächtig, dynamisch und anpassungsfähig sind, um im Vergleich zu Sprachen ohne vorhandene Polymorphismus zu verwenden. Somit können sie dynamische Systeme (d. H. Die reale Welt, maschinelles Lernen, AI) leichter modellieren.

Wenn ein Objekt von einem Konstruktor der Klasse erstellt wird, wird das resultierende Objekt als als erstellt Beispiel der Klasse und die für das Objekt spezifischen Elementvariablen werden aufgerufen Instanzvariablen, im Gegensatz zu den Klassenvariablen über die Klasse geteilt.

In einigen Sprachen sind Klassen nur eine Kompilierungszeitfunktion (neue Klassen können nicht zur Laufzeit deklariert werden), während in anderen Sprachen Klassen sind erstklassige Bürger, und sind im Allgemeinen selbst Objekte (typisch vom Typ Klasse oder ähnliches). In diesen Sprachen wird eine Klasse, die Klassen erstellt Metaklas.

Klasse vs. Typ

Im ungezwungenen Gebrauch beziehen sich die Menschen oft auf die "Klasse" eines Objekts, aber eng genommen haben Objekte Typ: Die Schnittstelle, nämlich die Arten von Mitgliedsvariablen, die Signaturen von Mitgliedsfunktionen (Methoden) und Eigenschaften, die diese erfüllen. Gleichzeitig verfügt eine Klasse über eine Implementierung (insbesondere die Implementierung der Methoden) und kann Objekte eines bestimmten Typs mit einer bestimmten Implementierung erstellen.[3] In den Begriffen der Typtheorie ist eine Klasse eine Implementierung‍ - ‌a Beton Datenstruktur und Sammlung von Unterprogrammen Schnittstelle. Unterschiedliche (konkrete) Klassen können Objekte desselben (abstrakten) Typs produzieren (abhängig vom Typsystem). Zum Beispiel der Typ Stapel könnte mit zwei Klassen implementiert werden - Smallstack (schnell für kleine Stapel, aber schlecht skaliert) und SkalableStack (skaliert gut, aber hoher Overhead für kleine Stapel). In ähnlicher Weise kann eine bestimmte Klasse mehrere verschiedene Konstruktoren haben.

Klassentypen repräsentieren im Allgemeinen Substantive wie eine Person, einen Ort oder eine Sache oder etwas nominalisiertund eine Klasse repräsentiert eine Implementierung dieser. Zum Beispiel a Banane Typ kann die Eigenschaften und Funktionalität von darstellen Bananen im Allgemeinen, während die Abcbanana und Xyzbanana Klassen würden Möglichkeiten zur Herstellung von Bananen darstellen (sagen wir Bananenlieferanten oder Datenstrukturen und Funktionen, um Bananen in einem Videospiel darzustellen). Das Abcbanana Klasse könnte dann bestimmte Bananen produzieren: Instanzen der Abcbanana Klasse wäre Objekte vom Typ Banane. Oft wird nur eine einzige Implementierung eines Typs angegeben. In diesem Fall ist der Klassenname häufig mit dem Typennamen identisch.

Design und Implementierung

Die Klassen bestehen aus strukturellen und Verhaltensbestandteilen.[4] Programmiersprachen, die Klassen als Programmierkonstrukt enthalten, bieten Unterstützung für verschiedene klassenbezogene Funktionen und die Syntax, die für die Verwendung dieser Funktionen erforderlich ist, von einer Programmiersprache zu einer anderen.

Struktur

Uml Notation für Klassen

Eine Klasse enthält Daten aufstellen Beschreibungen (oder Eigenschaften, Felder, Daten Mitglieder, oder Attribute). Dies sind in der Regel Feldtypen und Namen, die mit staatlichen Variablen zur Programmlaufzeit verbunden sind. Diese Zustandsvariablen gehören entweder zur Klasse oder zu bestimmten Instanzen der Klasse. In den meisten Sprachen bestimmt die von der Klasse definierte Struktur das Layout des von ihren Instanzen verwendeten Speichers. Andere Implementierungen sind möglich: Zum Beispiel Objekte in Python Verwenden Sie assoziative Schlüsselwertbehälter.[5]

Einige Programmiersprachen wie Eiffel -Support -Spezifikation von Invarianten als Teil der Definition der Klasse und durchsetzen sie durch das Typsystem. Verkapselung des Staates ist notwendig, um die Invarianten der Klasse durchzusetzen.

Verhalten

Das Verhalten der Klasse oder seiner Instanzen wird verwendet Methoden. Methoden sind Unterroutinen mit der Fähigkeit, Objekte oder Klassen zu operieren. Diese Operationen können den Zustand eines Objekts verändern oder einfach nur Möglichkeiten bieten, darauf zuzugreifen.[6] Es gibt viele Arten von Methoden, aber die Unterstützung für sie variiert über Sprachen hinweg. Einige Arten von Methoden werden vom Programmierercode erstellt und aufgerufen, während andere spezielle Methoden-wie Konstruktoren, Destruktoren und Conversion-Operatoren-vom Compiler-generierten Code erstellt und aufgerufen werden. Eine Sprache kann es dem Programmierer auch ermöglichen, diese speziellen Methoden zu definieren und aufzurufen.[7][8]

Das Konzept der Klassenschnittstelle

Jede Klasse Geräte (oder realisiert) eine Schnittstelle durch Bereitstellung Struktur und Verhalten. Die Struktur besteht aus Daten und Zustand, und das Verhalten besteht aus Code, die angeben, wie Methoden implementiert werden.[9] Es besteht eine Unterscheidung zwischen der Definition einer Schnittstelle und der Implementierung dieser Schnittstelle. Diese Zeile ist jedoch in vielen Programmiersprachen verschwommen, da Klassenerklärungen eine Schnittstelle sowohl definieren als auch implementieren. Einige Sprachen bieten jedoch Funktionen, die die Schnittstelle und Implementierung trennen. Zum Beispiel eine abstrakte Klasse kann eine Schnittstelle ohne Implementierung definieren.

Sprachen, die die Erbschaft der Klasse unterstützen, ermöglichen es auch Klassen, Schnittstellen aus den Klassen zu erben, aus denen sie abgeleitet sind.

Wenn "Klasse A" beispielsweise von "Klasse B" erbt und wenn "Klasse B" die Schnittstelle "Schnittstelle B" implementiert, dann erbt "Klasse A" auch die von "Schnittstelle B" bereitgestellte Funktionalität (Konstanten und Methodenerklärung).

In Sprachen, die unterstützen Zugriffsspezifizierer, Die Schnittstelle einer Klasse gilt als die Reihe von öffentlichen Mitgliedern der Klasse, einschließlich sowohl Methoden als auch Attribute (über implizit Getter- und Setter -Methoden); Private Mitglieder oder interne Datenstrukturen sollen nicht vom externen Code abhängig sein und sind daher nicht Teil der Schnittstelle.

Die objektorientierte Programmiermethode schreibt vor, dass die Operationen einer Schnittstelle einer Klasse voneinander unabhängig sein sollen. Es führt zu einem geschichteten Design, bei dem Clients einer Schnittstelle die in der Schnittstelle deklarierten Methoden verwenden. Eine Schnittstelle stellt keine Anforderungen an Kunden, um die Vorgänge einer Schnittstelle in einer bestimmten Reihenfolge aufzurufen. Dieser Ansatz hat den Vorteil, dass der Client -Code davon ausgehen kann, dass die Vorgänge einer Schnittstelle zur Verwendung verfügbar sind, wenn der Client Zugriff auf das Objekt hat.[10]

Beispiel

Die Tasten auf der Vorderseite Ihres Fernsehgeräts sind die Schnittstelle zwischen Ihnen und der elektrischen Verkabelung auf der anderen Seite seines Plastikgehäuses. Sie drücken die Taste "Power", um den Fernseher ein- und auszuschalten. In diesem Beispiel ist Ihr bestimmtes Fernsehen die Instanz, jede Methode wird durch eine Schaltfläche dargestellt, und alle Schaltflächen zusammenstellen die Schnittstelle (andere Fernsehgeräte, die das gleiche Modell wie Ihre haben, würden dieselbe Schnittstelle haben). In ihrer häufigsten Form ist eine Schnittstelle eine Spezifikation einer Gruppe verwandter Methoden ohne die damit verbundene Implementierung der Methoden.

Ein Fernsehgerät hat auch eine Vielzahl von Attributewie Größe und ob es Farbe unterstützt, was zusammen seine Struktur umfasst. Eine Klasse repräsentiert die vollständige Beschreibung eines Fernsehers, einschließlich seiner Attribute (Struktur) und Schaltflächen (Schnittstelle).

Die Gesamtzahl der hergestellten Fernseher zu erhalten, könnte a sein Statische Methode der Fernsehklasse. Diese Methode ist eindeutig mit der Klasse verbunden, liegt jedoch außerhalb der Domäne jeder einzelnen Instanz der Klasse. Eine statische Methode, die eine bestimmte Instanz aus dem Satz aller Fernsehobjekte herausfindet, ist ein weiteres Beispiel.

Zugänglichkeit der Mitglieder

Das Folgende ist ein üblicher Satz von Zugriffsspezifizierer:[11]

  • Privatgelände (oder Klassenprivat) schränkt den Zugriff auf die Klasse selbst ein. Nur Methoden, die Teil derselben Klasse sind, können auf private Mitglieder zugreifen.
  • Geschützt (oder klassengeschützt) Ermöglicht es der Klasse selbst und all ihren Unterklassen, auf das Mitglied zugreifen zu können.
  • Öffentlichkeit bedeutet, dass jeder Code mit seinem Namen auf das Mitglied zugreifen kann.

Obwohl viele objektorientierte Sprachen die oben genannten Zugriffsspezifizierer unterstützen, kann sich ihre Semantik unterscheiden.

Objektorientiertes Design verwendet die Zugriffsspezifizierer in Verbindung mit sorgfältigem Design öffentlicher Methodenimplementierungen, um Klasseninvarianten durchzusetzen-Konstruktionen im Zustand der Objekte. Eine gemeinsame Verwendung von Zugriffsspezifizierern besteht darin, die internen Daten einer Klasse von ihrer Schnittstelle zu trennen: Die interne Struktur wird privat gemacht, während öffentlich Accessor -Methoden kann verwendet werden, um solche privaten Daten zu inspizieren oder zu ändern.

Zugriffsspezifizierer kontrollieren nicht unbedingt SichtweiteIn dem möglicherweise auch private Mitglieder für den externen Code des Kunden sichtbar sein. In einigen Sprachen kann ein unzugängliches, aber sichtbares Mitglied zur Laufzeit (z. vom Typ Checker verhindert.[12]

Die verschiedenen objektorientierten Programmiersprachen erzwingen die Zugänglichkeit und Sichtbarkeit von Mitgliedern in verschiedenen Abschlüssen und je nach Sprache der Sprache Typ System und Zusammenstellung von Richtlinien, die bei beiden erzwungen werden Kompilierungszeit oder Laufzeit. Zum Beispiel die Java Die Sprache erlaubt keinen Clientcode, der auf die privaten Daten einer Klasse zugreift, um zu kompilieren.[13] In dem C ++ Sprache, private Methoden sind sichtbar, aber in der Schnittstelle nicht zugänglich. Sie können jedoch unsichtbar gemacht werden, indem ausdrücklich vollständig abstrakte Klassen deklariert werden, die die Schnittstellen der Klasse darstellen.[14]

Einige Sprachen verfügen über andere Barrierefreiheitschemata:

  • Instanz vs. Klassenzugänglichkeit: Rubin Unterstützung Instanz-privat und Instanzgeschützt Zugriffsspezifizierer anstelle von Klassenprivaten bzw. vom Klassengeschützten. Sie unterscheiden sich darin, dass sie den Zugriff basierend auf der Instanz selbst und nicht auf der Klasse der Instanz einschränken.[15]
  • Freund: C ++ unterstützt einen Mechanismus, bei dem eine Funktion explizit als a deklariert wird Freundschaftsfunktion der Klasse kann auf die als private oder geschützten Mitglieder zugreifen.[16]
  • Pfad basiert: Java unterstützt die Einschränkung des Zugriffs auf ein Mitglied innerhalb von a Java -Paket, das ist der logische Pfad der Datei. Es ist jedoch eine übliche Praxis, wenn Sie ein Java -Framework erweitern, um Klassen im selben Paket wie eine Framework -Klasse zu implementieren, um auf geschützte Mitglieder zuzugreifen. Die Quelldatei kann an einem völlig anderen Ort vorhanden und in einer anderen .JAR -Datei bereitgestellt werden, befinden sich dennoch in Bezug auf die JVM auf dem gleichen logischen Pfad.[11]

Inter-Class-Beziehungen

Zusätzlich zum Design von eigenständigen Klassen können Programmiersprachen fortgeschrittenere Klassengestaltung basieren, die auf Beziehungen zwischen Klassen basieren. Die häufig vorgesehenen Funktionen für die Konstruktion von Beziehungen zwischen den Klasseen sind üblicherweise Zusammensetzung und Hierarchisch.

Zusammensetzung

Klassen können aus anderen Klassen zusammengesetzt werden, wodurch eine Zusammensetzung zwischen der beigefügten Klasse und ihren eingebetteten Klassen hergestellt wird. Die Zusammensetzung zwischen Klassen ist auch allgemein als a bekannt hat ein Beziehung.[17] Zum Beispiel könnte ein Klasse "Auto" aus einer Klasse "Motor" bestehen und enthalten. Daher ein Auto hat an Motor. Ein Aspekt der Zusammensetzung ist die Eindämmung, die das Gehäuse von Komponenteninstanzen durch die Instanz mit ihnen ist. Wenn ein umschließendes Objekt Komponenteninstanzen nach Wert enthält, haben die Komponenten und sein umschließendes Objekt eine ähnliche Lebensdauer. Wenn die Komponenten durch Referenz enthalten sind, haben sie möglicherweise keine ähnliche Lebensdauer.[18] Zum Beispiel in Objective-C 2.0:

@Schnittstelle Auto: NSOBJECT @Eigentum Nsstring *Name; @Eigentum Motor *Motor @Eigentum Nsarray *Reifen; @Ende 

Dies Auto Klasse hat eine Instanz von Nsstring (a Saite Objekt), Motor, und Nsarray (ein Array -Objekt).

Hierarchisch

Klassen können sein abgeleitet aus einem oder mehreren bestehenden Klassen, wodurch eine hierarchische Beziehung zwischen den abgeleiteten Klassen hergestellt wird (Basisklassen, Elternklassen oder Superklassen) und die abgeleitete Klasse (Kinderklasse oder Unterklasse). Die Beziehung der abgeleiteten Klasse zu den abgeleiteten Klassen ist allgemein bekannt als eine ist ein Beziehung.[19] Zum Beispiel könnte eine Klasse 'Taste' aus einer Klasse 'Steuerung' abgeleitet werden. Daher ein Knopf ist ein Kontrolle. Struktur- und Verhaltensmitglieder der übergeordneten Klassen sind vererbt von der Kinderklasse. Abgeleitete Klassen können zusätzlich zu denen, die sie erben und sind deshalb Spezialisierungen ihrer Superklassen. Auch abgeleitete Klassen können überschreiben Vererbte Methoden, wenn die Sprache zulässt.

Nicht alle Sprachen unterstützen die Mehrfachvererbung. Beispielsweise ermöglicht Java eine Klasse, mehrere Schnittstellen zu implementieren, jedoch nur von einer Klasse zu erben.[20] Wenn eine multiple Vererbung erlaubt ist, ist die Hierarchie a Regie acyclische Graphen (oder kurz Dag), sonst ist es a Baum. Die Hierarchie hat Klassen als Knoten und Vererbungsbeziehungen als Links. Es ist wahrscheinlicher, dass Klassen auf dem gleichen Niveau sind damit verbundenen als Klassen in verschiedenen Ebenen. Die Ebenen dieser Hierarchie werden genannt Schichten oder Abstraktionsniveaus.

Beispiel (vereinfachtes Objektiv-C 2.0-Code von iPhone SDK):

@Schnittstelle Uiresponder: NSOBJECT // ... @Schnittstelle UIView: Uiresponder // ... @Schnittstelle UiscrollView: UIView // ... @Schnittstelle UitableView: UiscrollView // ... 

In diesem Beispiel eine UitableView ist ein UiscrollView ist ein UIView ist ein Uiresponder ist ein NSOBJECT.

Definitionen der Unterklasse

Konzeptionell ist eine Superklasse a Superset seiner Unterklassen. Zum Beispiel würde eine gemeinsame Klassenhierarchie beinhalten GraphicObject als Superklasse von Rechteck und Ellipse, während Quadrat wäre eine Unterklasse von Rechteck. Das sind alle Teilmengenbeziehungen Auch in der Set -Theorie sind alle Quadrate Rechtecke, aber nicht alle Rechtecke sind Quadrate.

Ein häufiger konzeptioneller Fehler ist, a zu verwechseln Teil von Beziehung zu einer Unterklasse. Zum Beispiel sind ein Auto und ein LKW beide Fahrzeuge Arten und es wäre angebracht, sie als Unterklassen einer Fahrzeugklasse zu modellieren. Es wäre jedoch ein Fehler, die Komponententeile des Autos als Unterklassenbeziehungen zu modellieren. Zum Beispiel besteht ein Auto aus Motor und Körper, aber es wäre nicht geeignet, Motor oder Körper als Unterklasse des Autos zu modellieren.

Im Objektorientierte Modellierung Diese Art von Beziehungen werden typischerweise als Objekteigenschaften modelliert. In diesem Beispiel die Auto Klasse würde eine Eigenschaft namens genannt haben Teile. Teile würde tippt, um eine Sammlung von Objekten zu halten, wie z. B. Fälle von Körper, Motor, Reifenusw. Objektmodellierungssprachen wie z. Uml Fügen Sie Fähigkeiten zum Modellieren verschiedener Aspekte von "Teil von" und anderen Arten von Beziehungen ein - Daten wie die Kardinalität der Objekte, Einschränkungen für Eingabe- und Ausgabewerte usw. Diese Informationen können von Entwickler -Tools verwendet werden, um zusätzlichen Code neben dem Basic zu generieren Datennennzeichen für die Objekte, z. B. Fehlerprüfung Methoden erhalten und festlegen.[21]

Eine wichtige Frage bei der Modellierung und Implementierung eines Systems von Objektklassen ist, ob eine Klasse eine oder mehrere Superklassen haben kann. In der realen Welt mit tatsächlichen Sätzen wäre es selten, Sets zu finden, die sich nicht mit mehr als einem anderen Set überschneideten. Während einige Systeme wie Geschmack und CLOS mehr als einem Elternteil eine Fähigkeit bieten, dies zur Laufzeit zu tun, ist die Komplexität ein, die viele in der objektorientierten Gemeinschaft gegen die Ziele der Verwendung von Objektklassen in erster Linie betrachten. Wenn Sie verstehen, welche Klasse für den Umgang mit einer Nachricht verantwortlich ist, kann dies bei mehr als einer Superklasse komplex werden. Wenn diese Funktion achtlos verwendet wird, können einige der gleichen Systemkomplexität und Unklarheiten zur Vermeidung von Unklarheiten entwickelt werden.[22]

Die meisten modernen objektorientierten Sprachen wie SmallTalk und Java erfordern zur Laufzeit eine einzige Erbschaft. Für diese Sprachen kann die multiple Vererbung für die Modellierung nützlich sein, jedoch nicht für eine Implementierung.

Jedoch, Semantisches Web Anwendungsobjekte haben mehrere Superklassen. Die Volatilität des Internets erfordert diese Flexibilität und die technologischen Standards wie die Web -Ontologie -Sprache (OWL) sind entwickelt, um es zu unterstützen.

Ein ähnliches Problem ist, ob die Klassenhierarchie zur Laufzeit geändert werden kann oder nicht. Sprachen wie Geschmack, Clos und SmallTalk unterstützen diese Funktion als Teil ihrer Metaobjektprotokolle. Da Klassen selbst erstklassige Objekte sind, ist es möglich, dass sie ihre Struktur dynamisch ändern, indem sie ihnen die entsprechenden Nachrichten senden. Andere Sprachen, die sich mehr auf starke Typen wie Java und C ++ konzentrieren, erlauben die Klassenhierarchie nicht zur Laufzeit. Semantische Webobjekte haben die Fähigkeit für Änderungen der Laufzeit am Klassen. Die Rationale ähnelt der Rechtfertigung für die Erlaubnis mehrerer Superklassen, dass das Internet so dynamisch und flexibel ist, dass dynamische Änderungen an der Hierarchie erforderlich sind, um diese Volatilität zu verwalten.[23]

Orthogonalität des Klassenkonzepts und der Vererbung

Obwohl allgemein klassenbasierte Sprachen angenommen werden, um die Vererbung zu unterstützen, ist die Vererbung kein intrinsischer Aspekt des Konzepts der Klassen. Einige Sprachen, oft als "bezeichnet"objektbasierte Sprachen", Unterstützungsklassen unterstützen jedoch keine Vererbung. Beispiele für objektbasierte Sprachen umfassen frühere Versionen von Visual Basic.

Innerhalb objektorientierter Analyse

Im Objektorientierte Analyse und in Uml, ein Verband Zwischen zwei Klassen stellt eine Zusammenarbeit zwischen den Klassen oder ihren entsprechenden Instanzen dar. Assoziationen haben Anweisungen; Beispielsweise zeigt eine bidirektionale Assoziation zwischen zwei Klassen, dass beide Klassen ihre Beziehung bewusst sind.[24] Assoziationen können nach ihrem Namen oder Zweck gekennzeichnet werden.[25]

Eine Assoziationsrolle wird am Ende eines Verbandes eingestellt und beschreibt die Rolle der entsprechenden Klasse. Beispielsweise beschreibt eine "Abonnenten" -Prolle die Art und Weise, wie Instanzen der Klasse "Person" an einer "Abonnement-zu" -Eboziation mit der Klasse "Magazine" beteiligt sind. Außerdem hat ein "Magazin" die Rolle des "abonnierten Magazins" in derselben Vereinigung. Die Multiplizität der Assoziationsrolle beschreibt, wie viele Instanzen jeder Instanz der anderen Klassen der Assoziation entsprechen. Häufige Multiplikationen sind "0..1", "1..1", "1 ..*" und "0 ..*", wobei der "*" eine beliebige Anzahl von Instanzen angibt.[24]

Taxonomie der Klassen

Es gibt viele Kategorien von Klassen, von denen einige überschneiden.

Abstrakt und konkret

In einer Sprache, die die Vererbung unterstützt, und abstrakte Klasse, oder Abstrakte Basisklasse (ABC) ist eine Klasse, die nicht instanziiert werden kann, da sie entweder als abstrakt bezeichnet oder einfach angibt Abstrakte Methoden (oder Virtuelle Methoden). Eine abstrakte Klasse kann Implementierungen einiger Methoden bereitstellen und auch virtuelle Methoden übergeben Unterschriften die von direkten oder indirekten Nachkommen der abstrakten Klasse implementiert werden sollen. Bevor eine aus einer abstrakten Klasse abgeleitete Klasse instanziiert werden kann, müssen alle abstrakten Methoden ihrer übergeordneten Klassen von einer Klasse in der Derivationskette implementiert werden.[26]

Die meisten objektorientierten Programmiersprachen ermöglichen es dem Programmierer, festzulegen, welche Klassen als abstrakt angesehen werden, und erlauben diese nicht zu instanziieren. Zum Beispiel in Java, C# und Php, das Schlüsselwort abstrakt wird genutzt.[27][28] Im C ++Eine abstrakte Klasse ist eine Klasse mit mindestens eine abstrakte Methode, die von der entsprechenden Syntax in dieser Sprache angegeben ist (eine reine virtuelle Funktion im C ++ - Sprachgebrauch).[26]

Eine Klasse, die nur virtuelle Methoden besteht, wird als reine abstrakte Basisklasse bezeichnet (oder Reines ABC) in C ++ und ist auch als als bekannt Schnittstelle von Nutzern der Sprache.[14] Andere Sprachen, insbesondere Java und C#, unterstützen eine Variante abstrakter Klassen als eine Schnittstelle über ein Schlüsselwort in der Sprache. In diesen Sprachen, Mehrfacherbe ist nicht erlaubt, aber eine Klasse kann mehrere Schnittstellen implementieren. Eine solche Klasse kann nur abstrakte öffentlich zugängliche Methoden enthalten.[20][29][30]

A Betonklasse ist eine Klasse, die sein kann instanziiertim Gegensatz zu abstrakten Klassen, die nicht.

Lokal und inner

In einigen Sprachen können Klassen in deklariert werden Bereiche Außer dem globalen Bereich. Es gibt verschiedene Arten solcher Klassen.

Ein innere Klasse ist eine Klasse, die in einer anderen Klasse definiert ist. Die Beziehung zwischen einer inneren Klasse und ihrer enthaltenden Klasse kann auch als eine andere Art von Klassenvereinigung behandelt werden. Eine innere Klasse ist in der Regel weder mit Instanzen der umschließenden Klasse verbunden noch zusammen mit ihrer umschließenden Klasse instanziiert. Abhängig von der Sprache kann es möglich sein oder nicht, sich von außerhalb der beigefügten Klasse auf die Klasse zu beziehen. Ein verwandtes Konzept ist innere Typen, auch bekannt als innerer Datentyp oder verschachtelter Typ, was eine Verallgemeinerung des Konzepts der inneren Klassen ist. C ++ ist ein Beispiel für eine Sprache, die sowohl innere Klassen als auch innere Typen unterstützt (über Typedef Erklärungen).[31][32]

Ein anderer Typ ist a Lokale Klasse, eine Klasse, die in einer Prozedur oder Funktion definiert ist. Dies begrenzt auf den Klassennamen auf den Bereich, in dem die Klasse deklariert wird, auf den Klassennamen ein. Abhängig von den semantischen Regeln der Sprache kann es zusätzliche Einschränkungen für lokale Klassen im Vergleich zu nicht-lokalen geben. Eine häufige Einschränkung besteht darin, lokale Klassenmethoden zu vermeiden, um auf lokale Variablen der beigefügten Funktion zuzugreifen. Zum Beispiel kann sich in C ++ auf eine lokale Klasse beziehen Statische Variablen in seiner umschließenden Funktion deklariert, kann aber möglicherweise nicht auf die Funktion zugreifen Automatische Variablen.[33]

Metaklasse

Metaklasse sind Klassen, deren Instanzen Klassen sind.[34] Eine Metaklasse beschreibt eine gemeinsame Struktur einer Sammlung von Klassen und kann a implementieren Designmuster oder bestimmte Arten von Klassen beschreiben. Metaklasse wird häufig verwendet, um zu beschreiben Frameworks.[35]

In einigen Sprachen, wie z. Python, Rubin oder Smalltalk, eine Klasse ist auch ein Objekt; Somit ist jede Klasse eine Instanz einer einzigartigen Metaklas, die in die Sprache eingebaut ist.[5] [36] [37] Das Gemeinsames Lisp -Objektsystem (CLOS) liefert MetaObject -Protokolle (MOPS) Um diese Klassen und Metaklasse zu implementieren.[38]

Nicht-Subklassierbar

Mit nicht subklassierbaren Klassen können Programmierer Klassen und Hierarchien von Klassen entwerfen, bei denen in einer gewissen Ebene in der Hierarchie eine weitere Ableitung verboten ist (eine eigenständige Klasse kann auch als nicht subklassierbar bezeichnet werden, was die Bildung einer Hierarchie verhindert). Vergleichen Sie dies zu abstrakt Klassen, die implizieren, ermutigen und Ableitungen erfordern, um überhaupt verwendet zu werden. Eine nicht subklassierbare Klasse ist implizit Beton.

Eine nicht-subklassierbare Klasse wird erstellt, indem die Klasse als deklariert wird sealed in C# oder als final in Java oder Php.[39][40][41] Zum Beispiel Javas String Klasse ist als als bezeichnet als als Finale.[42]

Nicht subklassierbare Klassen können es einem Compiler (in kompilierten Sprachen) ermöglichen, Optimierungen durchzuführen, die für Unterklassenklassen nicht verfügbar sind. [43]

Offene Klasse

Eine offene Klasse kann geändert werden. Typischerweise an ausführbares Programm kann nicht von Kunden geändert werden. Entwickler können häufig einige Klassen ändern, aber normalerweise können die Standard- oder integrierten Standards nicht ändern. Im RubinAlle Klassen sind offen. Im Python, Klassen können zur Laufzeit erstellt werden und alle danach geändert werden.[44] Objektiv-C-Kategorien Ermöglichen Sie dem Programmierer, einer vorhandenen Klasse Methoden hinzuzufügen, ohne diese Klasse neu kompilieren zu müssen oder sogar Zugriff auf seinen Quellcode zu haben.

Mischungen

Einige Sprachen unterstützen besondere Unterstützung für MischungenObwohl in jeder Sprache mit mehreren Vererbung ein Mixin einfach eine Klasse ist, die keine Beziehung zwischen IS-A-A-Typ darstellt. Mixins werden typischerweise verwendet, um mehreren Klassen dieselben Methoden hinzuzufügen. Zum Beispiel eine Klasse UnicodeConversionMixin Könnte eine Methode genannt werden unicode_to_ascii Wenn in den Klassen enthalten Filerader und Webseitencraper das hat keinen gemeinsamen Elternteil.

Teilweise

In Sprachen, die die Funktion unterstützen, a Teilklasse ist eine Klasse, deren Definition innerhalb eines einzigen in mehrere Stücke aufgeteilt werden kann Quellcode Datei oder über mehrere Dateien hinweg.[45] Die Teile werden zur Kompilierungszeit verschmolzen, wodurch Compiler das gleiche wie für eine unparteiische Klasse ausgibt.

Die Hauptmotivation für die Einführung von Teilklassen besteht darin, die Umsetzung von zu erleichtern Codegeneratoren, wie zum Beispiel visuelle Designer.[45] Ansonsten ist es eine Herausforderung oder Kompromiss, Codegeneratoren zu entwickeln, die den generierten Code verwalten können, wenn er innerhalb von Entwickler geschriebenen Code verschachtelt ist. Unter Verwendung von Teilklassen kann ein Codegenerator eine separate Datei oder eine grobkörnige Teilklasse innerhalb einer Datei verarbeiten und wird somit vom einwandfreien generierten Code durch ein umfassendes Parsing, erhöht, die Effizienz des Compilers erhöht und das potenzielle Risiko des Korruptions-Entwicklercodes beseitigt. In einer einfachen Implementierung von Teilklassen kann der Compiler eine Phase von durchführen Vorkompilierung wo es alle Teile einer Teilklasse "vereint". Dann kann die Zusammenstellung wie gewohnt fortgesetzt werden.

Weitere Vorteile und Auswirkungen der Teilklassenfunktion umfassen:

  • Ermöglicht die Trennung des Schnittstellen- und Implementierungscodes einer Klasse auf einzigartige Weise.
  • Erleichtert die Navigation durch große Klassen innerhalb eines Editor.
  • Ermöglicht Trennung von Bedenkenauf ähnliche Weise wie Aspekt-orientiertes Programmieren aber ohne zusätzliche Werkzeuge.
  • Ermöglicht es mehreren Entwicklern, gleichzeitig an einer einzelnen Klasse zu arbeiten, ohne den einzelnen Code zu einem späteren Zeitpunkt in eine Datei zusammenzuführen.

Teilklassen existierten in Smalltalk unter dem Namen Klassenerweiterungen für beträchtliche Zeit. Mit der Ankunft der .NET Framework 2, Microsoft Einführte Teilklassen, unterstützt in beiden C# 2.0 und Visual Basic 2005. Winrt unterstützt auch Teilklassen.

Beispiel in vb.net

Dieses einfache Beispiel, geschrieben in Visual Basic .netzeigt, wie Teile derselben Klasse in zwei verschiedenen Dateien definiert sind.

Datei1.VB
Teilweise Klasse Meine Klasse  Privatgelände _Name Wie Saite Ende Klasse 
Datei2.VB
Teilweise Klasse Meine Klasse  Öffentlichkeit Schreibgeschützt Eigentum Name() Wie Saite  Erhalten  Zurückkehren _Name  Ende Erhalten  Ende Eigentum Ende Klasse 

Beim Kompilieren ist das Ergebnis das gleiche, als wären die beiden Dateien wie eins geschrieben, wie dies:

Klasse Meine Klasse  Privatgelände _Name Wie Saite  Öffentlichkeit Schreibgeschützt Eigentum Name() Wie Saite  Erhalten  Zurückkehren _Name  Ende Erhalten  Ende Eigentum Ende Klasse 

Beispiel in Objective-C

Im Ziel c, Teilklassen, auch bekannt als Kategorien, kann sogar über mehrere Bibliotheken und ausführbare Ausführungsbereiche verbreitet werden, wie das folgende Beispiel. Ein wesentlicher Unterschied besteht jedoch darin, dass die Kategorien von Objective-C Definitionen in einer anderen Schnittstellenerklärung überschreiben können und dass die Kategorien nicht der ursprünglichen Klassendefinition sind (die erste erfordert das letzte).[46] Stattdessen kann .NET -Teilklasse keine widersprüchlichen Definitionen haben, und alle teilweisen Definitionen sind den anderen gleich.[45]

In Foundation, Header -Datei nsdata.h:

@Schnittstelle Nsdata: NSOBJECT - (Ich würde)InitwithContentsofurl:(Nsurl *)URL; // ... @Ende 

In der von der benutzerversorgten Bibliothek, einer separaten Binärdatei von Foundation Framework, Header-Datei NSDATA+BASE64.H:

#import <foundation/foundation.h> @Schnittstelle Nsdata (Base64) - (Nsstring *)Base64String; - (Ich würde)initwithbase64string:(Nsstring *)Base64String; @Ende 

Und in einer App eine weitere separate Binärdatei, Quellcode -Datei main.m:

#import <foundation/foundation.h> #import "nsdata+base64.h" int hauptsächlich(int argc, verkohlen *argv[]) {   wenn (argc < 2)   Rückkehr Exit_failure;   Nsstring *SourceURLString = [Nsstring StringwithcString:argv[1]];   Nsdata *Daten = [[Nsdata Alloc] InitwithContentsofurl: [Nsurl Urlwithstring:SourceURLString]];   Nslog(@"%@", [Daten Base64String]);   Rückkehr Exit_success; } 

Der Dispatcher findet beide Methoden, die über die NSDATA -Instanz aufgerufen wurden, und ruft beide korrekt auf.

Nicht anstantierbar

Unbegründbare Klassen Ermöglichen Sie den Programmierern, sich pro Klasse und Methoden zu gruppieren, die zur Laufzeit ohne Instanz der Klasse zugänglich sind. In der Tat ist die Instanziierung für diese Art von Klasse verboten.

Zum Beispiel kann in C#eine Klasse, die mit "statisch" gekennzeichnet ist Instanzkonstruktoren, und ist versiegelt.[47]

Unbenannt

Ein Unbenannte Klasse oder Anonyme Klasse ist eine Klasse, die bei Definition nicht an einen Namen oder eine Bezeichnung gebunden ist.[48][49] Dies ist analog zu genannten versus Unbenannte Funktionen.

Vorteile

Die Vorteile der Organisation von Software in Objektklassen fallen in drei Kategorien:[50]

  • Schnelle Entwicklung
  • Leichte Wartung
  • Wiederverwendung von Code und Designs

Objektklassen ermöglichen eine schnelle Entwicklung, da sie die semantische Lücke zwischen dem Code und den Benutzern verringern. Systemanalysten können mit Entwicklern und Benutzern sprechen, die im Wesentlichen denselben Vokabular verwenden, über Konten, Kunden, Rechnungen usw. sprechen. Objektklassen erleichtern häufig die schnelle Entwicklung, da die meisten objektorientierten Umgebungen mit leistungsstarken Debugging- und Test-Tools ausgestattet sind. Klassenfälle können zur Laufzeit überprüft werden, um zu überprüfen, ob das System wie erwartet funktioniert. Anstatt Dumps mit Kerngedächtnis zu erhalten, haben die meisten objektorientierten Umgebungen Debugging-Funktionen interpretiert, damit der Entwickler genau analysieren kann, wo im Programm der Fehler aufgetreten ist, und erkennen kann, welche Methoden zu welchen Argumenten und mit welchen Argumenten aufgerufen wurden.[51]

Objektklassen erleichtern die einfache Wartung durch die Kapselung. Wenn Entwickler das Verhalten eines Objekts ändern müssen, können sie die Änderung genau dieses Objekt und seine Komponententeile lokalisieren. Dies verringert das Potenzial für unerwünschte Nebenwirkungen durch Erhaltungsverbesserungen.

Die Wiederverwendung von Software ist auch ein wichtiger Vorteil der Verwendung von Objektklassen. Der Unterricht erleichtert die Wiederverwendung durch Vererbung und Schnittstellen. Wenn ein neues Verhalten erforderlich ist, kann es häufig erreicht werden, indem eine neue Klasse erstellt und diese Klasse das Standardverhalten und die Daten ihrer Superklasse erben und dann einen Aspekt des Verhaltens oder der Daten entsprechend anpassen. Die Wiederverwendung über Schnittstellen (auch als Methoden bezeichnet) tritt auf, wenn ein anderes Objekt eine Objektklasse aufrufen möchte (anstatt eine neue Art von Art von). Diese Methode zur Wiederverwendung beseitigt viele der gemeinsamen Fehler, die ihren Weg in die Software finden können, wenn ein Programm den Code von einem anderen wiederverwendet.[52]

Laufzeitdarstellung

Als Datentyp wird eine Klasse normalerweise als Kompilierungszeitkonstrukt angesehen.[53] Eine Sprache oder Bibliothek kann auch unterstützen Prototyp oder Fabrik MetaObjects die Laufzeitinformationen zu Klassen oder sogar Metadaten darstellen, die Zugriff aufnehmen Betrachtung Einrichtungen und Fähigkeit, Datenstrukturformate zur Laufzeit zu manipulieren. Viele Sprachen unterscheiden diese Art von Laufzeitinformationen Über Klassen aus einer Klasse mit der Grundlage, dass die Informationen zur Laufzeit nicht benötigt werden. Einige dynamische Sprachen machen keine strengen Unterscheidungen zwischen Laufzeit- und Kompilierungszeitkonstrukten und unterscheiden daher möglicherweise nicht zwischen MetaObjects und Klassen.

Zum Beispiel, wenn ein Mensch a ist metaObject Um die Klassenperson zu vertreten, können dann Instanzen der Klassenperson erstellt werden, indem die Einrichtungen des Menschen verwendet werden metaObject.

Siehe auch

Anmerkungen

  1. ^ Gamma et al. 1995, p. 14.
  2. ^ a b Bruce 2002, 2.1 Objekte, Klassen und Objekttypen, https://books.google.com/books?id=9ngwq3k1rwuc&pg=pa18.
  3. ^ Gamma et al. 1995, p. 17.
  4. ^ Gamma et al. 1995, p. 14.
  5. ^ a b "3. Datenmodell". Die Python -Sprachreferenz. Python Software Foundation. Abgerufen 2012-04-26.
  6. ^ Booch 1994, p. 86-88.
  7. ^ "Klassen (i)". C ++ Sprach -Tutorial. cplusplus.com. Abgerufen 2012-04-29.
  8. ^ "Klassen (ii)". C ++ Sprach -Tutorial. cplusplus.com. Abgerufen 2012-04-29.
  9. ^ Booch 1994, p. 105.
  10. ^ Jamrich, Parsons, Juni (2015-06-22). Neue Perspektiven Computerkonzepte, 2016. umfassend. Boston, MA. ISBN 9781305271616. OCLC 917155105.
  11. ^ a b "Zugriff auf Mitglieder einer Klasse kontrollieren". Die Java -Tutorials. Orakel. Abgerufen 2012-04-19.
  12. ^ "OOP08-CPP. RECHNEN SIE NICHT REBENSPRINDIERUNGEN ZU PRIVATIONEN DATEN". CERT C ++ Sicherer Codierungsstandard. Carnegie Mellon Universität. 2010-05-10. Archiviert von das Original Am 2015-10-03. Abgerufen 2012-05-07.
  13. ^ Ben-Ari, Mordechai (2007-01-24). "2.2 Kennungen" (PDF). Kompilieren Sie und Laufzeitfehler in Java. Abgerufen 2012-05-07.
  14. ^ a b Wild, Fred. "C ++ - Schnittstellen". Dr. Dobbs. UBM Techweb. Abgerufen 2012-05-02.
  15. ^ Thomas; Jagd. "Klassen, Objekte und Variablen". Programmieren Ruby: Der Leitfaden des pragmatischen Programmierers. Ruby-doc.org. Abgerufen 2012-04-26.
  16. ^ "Freundschaft und Erbschaft". C ++ Sprach -Tutorial. cplusplus.com. Abgerufen 2012-04-26.
  17. ^ Booch 1994, p. 180.
  18. ^ Booch 1994, p. 128-129.
  19. ^ Booch 1994, p. 112.
  20. ^ a b "Schnittstellen". Die Java -Tutorials. Orakel. Abgerufen 2012-05-01.
  21. ^ Berfeld, Marya (2. Dezember 2008). "Uml-zu-Java-Transformation in IBM Rational Software Architect Editionen und verwandte Software". IBM. Abgerufen 20. Dezember 2013.
  22. ^ Jacobsen, Ivar; Magnus Chrierson; Patrik Jonsson; Gunnar Overgaard (1992). Objektorientiertes Software -Engineering. Addison-Wesley ACM Press. pp.43–69. ISBN 0-201-54435-0.
  23. ^ Knublauch, Holger; Oberle, Daniel; Tetlow, Phil; Wallace, Evan (2006-03-09). "Ein semantischer Web-Primer für objektorientierte Softwareentwickler". W3c. Abgerufen 2008-07-30.
  24. ^ a b Bell, Donald. "UML -Grundlagen: Das Klassendiagramm". Entwickler arbeitet. IBM. Abgerufen 2012-05-02.
  25. ^ Booch 1994, p. 179.
  26. ^ a b "Polymorphismus". C ++ Sprach -Tutorial. cplusplus.com. Abgerufen 2012-05-02.
  27. ^ "Abstrakte Methoden und Klassen". Die Java -Tutorials. Orakel. Abgerufen 2012-05-02.
  28. ^ "Klassenabstraktion". PHP -Handbuch. Die PHP -Gruppe. Abgerufen 2012-05-02.
  29. ^ "Schnittstellen (C# Programmierhandbuch)". C# Programmierhandbuch. Microsoft. Abgerufen 2013-08-15.
  30. ^ "Vererbung (C# Programmierhandbuch)". C# Programmierhandbuch. Microsoft. Abgerufen 2012-05-02.
  31. ^ "Verschachtelte Klassen (nur C ++)". XL C/C ++ V8.0 für AIX. IBM. Abgerufen 2012-05-07.
  32. ^ "Lokale Typnamen (nur C ++)". XL C/C ++ V8.0 für AIX. IBM. Abgerufen 2012-05-07.
  33. ^ "Lokale Klassen (nur C ++)". XL C/C ++ V8.0 für AIX. IBM. Abgerufen 2012-05-07.
  34. ^ Booch 1994, p. 133-134.
  35. ^ "13 Klassen und Metaklasse". Pharo.gforge.inria.fr. Abgerufen 2016-10-31.
  36. ^ Thomas; Jagd. "Klassen und Objekte". Programmieren Ruby: Der Leitfaden des pragmatischen Programmierers. Ruby-doc.org. Abgerufen 2012-05-08.
  37. ^ Booch 1994, p. 134.
  38. ^ "MOP: Konzepte". Das monatliche MetaObject -Protokoll des LISP -Objektsystems. Assoziation von Lisp -Benutzern. Archiviert von das Original Am 2010-11-15. Abgerufen 2012-05-08.
  39. ^ "Versiegelt (C# Referenz)". C# Referenz. Microsoft. Abgerufen 2012-05-08.
  40. ^ "Schreiben der letzten Klassen und Methoden". Die Java -Tutorials. Orakel. Abgerufen 2012-05-08.
  41. ^ "PHP: Finale Keyword". PHP -Handbuch. Die PHP -Gruppe. Abgerufen 2014-08-21.
  42. ^ "String (Java -Plattform SE 7)". Java -Plattform, Standard Edition 7: API -Spezifikation. Orakel. Abgerufen 2012-05-08.
  43. ^ Marke, Sy. "Die Leistungsvorteile der endgültigen Klassen". Microsoft C ++ Team Blog. Microsoft. Abgerufen 4. April 2020.
  44. ^ "9. Klassen". Das Python -Tutorial. Python.org. Abgerufen 3. März 2018. Wie bei Modulen gilt die Klassen, die an der dynamischen Natur von Python teilnehmen: Sie werden zur Laufzeit erstellt und können nach der Erstellung weiter geändert werden.
  45. ^ a b c Mairaw; Billwagner; Tompratt-AQ (2015-09-19), "Teilklassen und Methoden", C# Programmierhandbuch, Microsoft, abgerufen 2018-08-08
  46. ^ Apple (2014-09-17), "Anpassen vorhandener Klassen", Programmierung mit Objektiv-C, Apfel, abgerufen 2018-08-08
  47. ^ "Statische Klassen und statische Klassenmitglieder (C# Programmierhandbuch)". C# Programmierhandbuch. Microsoft. Abgerufen 2012-05-08.
  48. ^ "Anonyme Klassen (die Java ™ -Tutorials> Lernen der Java -Sprache> Klassen und Objekte)". docs.oracle.com. Abgerufen 2021-05-13.
  49. ^ "PHP: Anonyme Klassen - Handbuch". www.php.net. Abgerufen 2021-08-11.
  50. ^ "Was ist ein Objekt?". Oracle.com. Oracle Corporation. Abgerufen 13. Dezember 2013.
  51. ^ Booch, Grady; Robert A. Maksimchuk; Michael W. Engle; Bobbi J. Young Ph.D.; Jim Conallen; Kelli A. Houston (30. April 2007). Objektorientierte Analyse und Design mit Anwendungen. Addison-Wesley Professional. S. 1–28. ISBN 978-0-201-89551-3. Abgerufen 20. Dezember 2013. Es gibt grundlegende einschränkende Faktoren der menschlichen Wahrnehmung; Wir können diese Einschränkungen durch die Verwendung von Zersetzung, Abstraktion und Hierarchie ansprechen.
  52. ^ Jacobsen, Ivar; Magnus Chrierson; Patrik Jonsson; Gunnar Overgaard (1992). Objektorientiertes Software -Engineering. Addison-Wesley ACM Press. ISBN 0-201-54435-0.
  53. ^ "C ++ International Standard" (PDF). Arbeitsentwurf, Standard für die Programmiersprache C ++. ISO/IEC JTC1/SC22 WG21. Abgerufen 5. Januar 2020.

Verweise

Weitere Lektüre