Konstruktor (objektorientierte Programmierung)

Im Klassenbasierte Objekt orientierte Programmierung, a Konstrukteur (Abkürzung: CTOR) ist eine besondere Art von Subroutine Gerufen nach Erstellen Sie ein Objekt. Es bereitet das neue Objekt für die Verwendung vor und akzeptiert häufig Argumente dass der Konstruktor verwendet wird, um die erforderlichen festzustellen Mitgliedsvariablen.

Ein Konstruktor ähnelt einem Instanzmethode, aber es unterscheidet sich von einer Methode darin, dass es keine expliziten hat Rückgabetyp, es ist nicht implizit vererbt Und es hat normalerweise unterschiedliche Regeln für Umfangsmodifikatoren. Konstruktoren haben oft den gleichen Namen wie die Deklaration Klasse. Sie haben die Aufgabe von Initialisierung Die Objekte Datenmitglieder und zu etablieren, die Invariante der Klasse, fehlschlägt, wenn die Invariante ungültig ist. Ein ordnungsgemäß geschriebener Konstruktor verlässt den resultierenden Objekt in einem gültig Zustand. Unveränderliche Objekte muss in einem Konstruktor initialisiert werden.

Die meisten Sprachen erlauben Überlastung Der Konstruktor, in dem es mehr als einen Konstruktor für eine Klasse mit unterschiedlichen Parametern geben kann. Einige Sprachen berücksichtigen einige spezielle Arten von Konstruktoren. Konstruktoren, die konkret eine einzelne Klasse verwenden, um Objekte zu erstellen und eine neue Instanz der Klasse zurückzugeben, werden abstrahiert von Fabriken, die auch Objekte erstellen, dies aber auf verschiedene Arten tun können, wobei mehrere Klassen oder verschiedene Zuordnungsschemata wie eins verwendet werden Objektpool.

Typen

Parametrisierte Konstruktoren

Konstruktoren, die mindestens ein Argument einnehmen können, werden als parametrisierte Konstruktoren bezeichnet. Wenn ein Objekt in einem parametrisierten Konstruktor deklariert wird, müssen die Anfangswerte als Argumente an die Konstruktorfunktion übergeben werden. Die normale Art der Objektdeklaration funktioniert möglicherweise nicht. Die Konstruktoren können explizit oder implizit bezeichnet werden. Die Methode zum Aufrufen des Konstruktors wird implizit auch als Kurzmethode bezeichnet.

Klasse Beispiel {  Öffentlichkeit:   Beispiel();   Beispiel(int a, int b);  // Parametrisierter Konstruktor.  Privatgelände:   int x_;   int y_; }; Beispiel::Beispiel() = Ursprünglich; Beispiel::Beispiel(int x, int y) : x_(x), y_(y) {} 
Beispiel e = Beispiel(0, 50);  // explizite Anruf. Beispiel E2(0, 50);  // implizite Anruf. 

Standardkonstruktoren

Wenn der Programmierer keinen Konstruktor für eine sofortige Klasse liefert, fügt Java Compiler a ein Standardkonstruktor in Ihren Code in Ihrem Namen. Dieser Konstruktor ist als Standardkonstruktor bekannt. Sie finden es nicht in Ihrem Quellcode (der Java -Datei), wie er während der Kompilierung in den Code eingefügt wurde und in der .class -Datei vorhanden ist. Das Verhalten des Standardkonstruktors ist sprachabhängig. Es kann Datenmitglieder auf Null oder andere gleiche Werte initialisieren, oder es kann überhaupt nichts tun. In Java bezieht sich ein "Standardkonstruktor" auf einen nullären Konstruktor, der vom Compiler automatisch generiert wird, wenn keine Konstruktoren für die Klasse definiert wurden, oder ohne von Programmierer definierte Konstruktoren (z. B. in Java, ruft der Standardkonstruktor implizit die auf den Der nulläre Konstruktor der Superklasse führt dann einen leeren Körper aus). Alle Felder bleiben bei ihrem Anfangswert von 0 (Ganzzahltypen), 0,0 (Floating-Punkt-Typen), False (boolescher Typ) oder Null (Referenztypen).

#enthalten  Klasse Student {  Öffentlichkeit:   Student(int a = 0, int b = 0);  // Standardkonstruktor.   int a;   int b; }; 

Konstruktoren kopieren

Wie C ++ unterstützt Java auch "Copy Constructor". Im Gegensatz zu C ++ erstellt Java jedoch keinen Standardkopiekonstruktor, wenn Sie nicht Ihre eigenen schreiben. Kopierkonstruktoren definieren die vom Compiler beim Kopieren von Klassenobjekten ausgeführten Aktionen. Ein Kopierkonstruktor hat einen formalen Parameter, der der Typ der Klasse ist (der Parameter kann eine Referenz auf ein Objekt sein). Es wird verwendet, um eine Kopie eines vorhandenen Objekts derselben Klasse zu erstellen. Obwohl beide Klassen gleich sind, zählt es als Konvertierungskonstruktor. Während Kopierkonstruktoren normalerweise eine abgekürzte Kopie CTOR oder CCTOR sind, haben sie nichts mit Klassenkonstruktoren zu tun, die in .NET verwendet werden, unter Verwendung derselben Abkürzung.

Konversionskonstruktoren

Conversion -Konstruktoren bieten einem Compiler ein Mittel, um implizit ein Objekt zu einer Klasse zu erstellen, das auf einem Objekt eines anderen Typs basiert. Diese Konstruktoren werden normalerweise implizit angerufen, um Argumente oder Operanden in einen geeigneten Typ umzuwandeln, können aber auch explizit genannt werden.

Konstruktoren bewegen

In C ++, Konstruktoren bewegen Nehmen Sie einen RValue -Verweis auf ein Objekt der Klasse und werden zur Implementierung der Eigentümerübertragung der Ressourcen des Parameterobjekts verwendet.

Syntax

  • Java, C ++, C#, Aktionen, Php 4 und Matlab Haben Sie eine Namenskonvention, bei der Konstruktoren den gleichen Namen haben wie die Klasse, mit der sie zugeordnet sind.
  • In PHP 5 ist ein empfohlener Name für einen Konstruktor __konstruieren. Für die Rückwärtskompatibilität wird eine Methode mit demselben Namen wie die Klasse aufgerufen, wenn __konstruieren Methode kann nicht gefunden werden. Seit PHP 5.3.3 funktioniert dies nur für Nicht-Named-Klassen.[1]
  • In Php 7 sollten Sie den Konstruktor immer als nennen __konstruieren. Methoden mit demselben Namen wie die Klasse lösen einen E_Deprecated Level -Fehler.[1]
  • Im Perl, Konstruktoren werden durch Konvention "neu" bezeichnet und müssen eine ganze Menge Objekterstellung durchführen.
  • Im Elchobjektsystem Für Perl Konstrukteure (benannt Neu) werden automatisch erstellt und durch Angabe a erweitert BAUEN Methode.
  • Im Visual Basic .net, der Konstruktor heißt "Neu".
  • Im PythonDer Konstruktor wird über zwei Methoden aufgeteilt ","__Neu__" und "__drin__". Das __Neu__ Die Methode ist für die Zuweisung von Speicher für die Instanz verantwortlich und empfängt die Klasse als Argument (konventionell genannt ".Cls"). Das __drin__ Die Methode (oft als "Initialiser" bezeichnet) wird die neu erstellte Instanz als Argument (konventionell genannt "übergeben.selbst").[2]
  • Objekt Pascal Konstruktoren werden durch das Schlüsselwort bedeuten "Konstrukteur"Und kann benutzerdefinierte Namen haben (aber meistens genannt"Schaffen").
  • Im Ziel cDie Konstruktormethode wird über zwei Methoden aufgeteilt. "Alloc" und "drin" mit dem Alloc Methode einstellen (zuweisen) Speicher für eine Instanz der Klasse und die drin Methode, die den größten Teil der Initanzierung der Instanz bearbeitet. Ein Aufruf der Methode "Neu"Auf beiden ruft beide an Alloc und die drin Methoden für die Klasseninstanz.

Speicherorganisation

In Java, C#und VB .NET erstellt der Konstruktor Referenztypobjekte in einer speziellen Speicherstruktur, die als "das" bezeichnet wird. "Haufen". Werttypen (z. B. int, doppelt usw.) werden in einer sequentiellen Struktur erstellt, die als" das "bezeichnet wird"Stapel". VB .NET und C# erlauben auch die Verwendung des Neu Bediener zum Erstellen von Werttypobjekten, diese Werttypobjekte werden jedoch im Stapel erstellt, unabhängig davon, ob der Bediener verwendet wird oder nicht.

In C ++ werden Objekte auf dem Stapel erstellt, wenn der Konstruktor ohne den neuen Bediener aufgerufen und auf dem Haufen erstellt wird, wenn der Konstruktor mit dem neuen Bediener aufgerufen wird. Stapelobjekte werden implizit gelöscht, wenn sie aus dem Zielfernrohr gehen, während Heap -Objekte implizit von einem Zerstörer oder explizit durch die Verwendung der verwendet werden müssen löschen Operator.

Sprachdetails

C ++

Im C ++Der Name des Konstruktors ist der Name der Klasse. Es gibt nichts zurück. Es kann Parameter wie jeder haben Mitgliedsfunktion. Konstruktorfunktionen werden normalerweise im öffentlichen Abschnitt deklariert, können jedoch auch in den geschützten und privaten Abschnitten deklariert werden, wenn der Benutzer den Zugriff auf sie einschränken möchte.

Der Konstruktor hat zwei Teile. Erstens ist das Initialisiererliste das folgt dem Parameterliste und vor der Methode. Es beginnt mit einem Dickdarm und die Einträge sind von Kommas getrennt. Die Initialisierungsliste ist nicht erforderlich, bietet jedoch die Möglichkeit, Werte für Datenmitglieder bereitzustellen und separate Zuweisungsanweisungen zu vermeiden. Die Initializer -Liste ist erforderlich, wenn Sie haben Const oder Referenztypdatenelemente oder Mitglieder, die keine parameterlose Konstruktorlogik haben. Zuordnungen treten gemäß der Reihenfolge auf, in der Datenmitglieder deklariert werden (auch wenn die Reihenfolge in der Initialisierungsliste unterschiedlich ist).[3] Der zweite Teil ist der Körper, der eine normale Methode ist, die in lockigen Klammern eingeschlossen ist.

C ++ ermöglicht mehr als einen Konstruktor. Die anderen Konstruktoren müssen unterschiedliche Parameter haben. Zusätzlich müssen Konstruktoren, die Parameter enthalten, deren Standardwerte angegeben sind, die Einschränkung einhalten, dass nicht alle Parameter einen Standardwert erhalten. Dies ist eine Situation, die nur dann wichtig ist, wenn ein Standardkonstruktor vorliegt. Der Konstruktor von a Basisklasse (oder Basisklassen) können auch von einer abgeleiteten Klasse aufgerufen werden. Konstruktorfunktionen werden nicht vererbt und ihre Adressen können nicht verwiesen werden. Wenn die Speicherzuweisung erforderlich ist, die Neu und löschen Die Betreiber werden implizit bezeichnet.

Ein Kopierkonstruktor hat einen Parameter desselben Typs wie übergeben wie Const Referenz zum Beispiel Vektor (Const Vector & RHS). Wenn es nicht explizit bereitgestellt wird, verwendet der Compiler den Kopierkonstruktor für jede Mitgliedsvariable oder kopiert einfach Werte bei primitiven Typen. Die Standardimplementierung ist nicht effizient, wenn die Klasse Mitglieder dynamisch zugeteilt hat (oder mit anderen Ressourcen übergeht), da sie zu doppelten Aufrufen an führen kann löschen (oder doppelte Freigabe von Ressourcen) nach Zerstörung.

Klasse Foobar {  Öffentlichkeit:   Foobar(doppelt r = 1.0,   doppelt Alpha = 0,0)  // Konstruktor, Parameter mit Standardwerten.   : x_(r * cos(Alpha))  // <- Initialisiererliste   {   y_ = r * Sünde(Alpha);  // <- Normale Zuordnung   }  Privatgelände:   doppelt x_;   doppelt y_; }; 

Beispielaufrufe:

Foobar a,   b(3),   c(5, M_PI/4); 

Bei der Rückgabe von Objekten aus Funktionen oder Übergeben von Objekten nach Wert werden die Objekte Konstruktor kopieren Rückgabewertoptimierung gilt.

C ++ generiert implizit einen Standardkopiekonstruktor, der die Kopiekonstruktoren für alle Basisklassen und alle Mitgliedsvariablen aufruft oder nicht zugänglich (privat). Die meisten Fälle fordern eine benutzerdefinierte Konstruktor kopieren (z.B. Referenzzählung, tiefe Kopie von Zeigern) erfordern auch das Anpassen der Zerstörer und die Kopieren von Zuweisungsbetreiber. Dies wird allgemein als die bezeichnet Herrschaft von drei.

C#

Beispiel C# Konstrukteur:

Öffentlichkeit Klasse Meine Klasse {  Privatgelände int a;  Privatgelände Saite b;  // Konstrukteur  Öffentlichkeit Meine Klasse() : Dies(42, "String")  {  }  // einen Konstruktor überladen  Öffentlichkeit Meine Klasse(int a, Saite b)  {  Dies.a = a;  Dies.b = b;  } } 
// irgendwo Code // ein Objekt mit dem Konstruktor oben instanziiert Meine Klasse c = Neu Meine Klasse(42, "String"); 

C# statischer Konstruktor

Im C#, a Statischer Konstruktor ist ein statischer Dateninitializer. Statische Konstruktoren werden ebenfalls genannt Klassenkonstruktoren. Da die tatsächliche generierte Methode den Namen hat .cctor Sie werden oft auch als "visutschen" bezeichnet.[4][5]

Statische Konstruktoren ermöglichen eine komplexe statische variable Initialisierung.[6] Statische Konstruktoren werden implizit aufgerufen, wenn die Klasse zum ersten Mal zugegriffen wird. Jeder Aufruf einer Klasse (statischer oder Konstruktoraufruf) löst die Ausführung der statischen Konstruktorin. Statische Konstruktoren sind Faden sicher und implementieren a Singleton -Muster. Wenn in a verwendet generische Programmierung Klasse, statische Konstruktoren werden bei jeder neuen generischen Instanziierung pro Typ aufgerufen. Statische Variablen werden ebenfalls instanziiert.

Öffentlichkeit Klasse Meine Klasse {  Privatgelände statisch int _EIN;  // Normaler Konstruktor  statisch Meine Klasse()  {  _EIN = 32;  }  // Standard -Standardkonstruktor  Öffentlichkeit Meine Klasse()  {  } } 
// irgendwo Code // ein Objekt mit dem Konstruktor oben instanziiert // kurz vor der Instanziierung // Der variable statische Konstruktor wird ausgeführt und _a ist 32 Meine Klasse c = Neu Meine Klasse(); 

Cfml

Cfml Verwendet eine Methode namens 'drin'als Konstruktormethode.

Käse.cfc

Komponente {  // Eigenschaften  Eigentum Name="Käsename";  // Konstrukteur  Funktion Käse drin( erforderlich Saite Käse ) {  Variablen.Käse = Argumente.Käse;  Rückkehr Dies;  } } 

Erstellen Sie eine Instanz eines Käses.

Mycheese = Neu Käse( 'Cheddar' ); 

Seit Coldfusion 10,[7] CFML hat auch unterstützt, den Namen der Konstruktormethode anzugeben:

Komponente Initmethod="Käse" {  // Eigenschaften  Eigentum Name="Käsename";  // Konstrukteur  Funktion Käse Käse( erforderlich Saite Käse ) {  Variablen.Käse = Argumente.Käse;  Rückkehr Dies;  } } 

Eiffel

Im EiffelDie Routinen, die neue Objekte initialisieren, werden aufgerufen Erstellungsverfahren. Erstellungsverfahren haben die folgenden Eigenschaften:

  • Erstellungsverfahren haben keinen expliziten Rückgabetyp (per Definition von Verfahren).[a]
  • Erstellungsverfahren werden benannt.
  • Erstellungsverfahren werden namentlich als Erstellungsverfahren im Text der Klasse bezeichnet.
  • Erstellungsverfahren können ausdrücklich aufgerufen werden, um vorhandene Objekte neu zu initialisieren.
  • Jede wirksame (d. H. Konkrete oder nicht-nicht-abstraktische) Klasse muss mindestens ein Erstellungsverfahren benennen.
  • Erstellungsverfahren müssen das neu initialisierte Objekt in einem Zustand lassen, der die Klasseninvariante erfüllt.[b]

Obwohl die Objekterstellung einige Feinheiten beinhaltet,[8] Die Schaffung eines Attributs mit einer typischen Erklärung x: T wie in einer Schöpfungsanweisung ausgedrückt create x.make besteht aus der folgenden Abfolge von Schritten:

  • Erstellen Sie eine neue direkte Instanz des Typs T.[c]
  • Führen Sie das Erstellungsverfahren aus make zur neu erstellten Instanz.
  • Fügen Sie das neu initialisierte Objekt an die Entität bei x.

Im ersten Ausschnitt unten, Klasse POINT ist definiert. Das Verfahren make wird nach dem Schlüsselwort codiert feature.

Das Schlüsselwort create Führen Sie eine Liste von Verfahren ein, mit denen Instanzen initialisiert werden können. In diesem Fall enthält die Liste default_create, ein Verfahren mit einer leeren Implementierung, die vom Unterricht geerbt wurde ANY, und die make Verfahren in der Klasse codiert.

Klasse  PUNKT schaffen  default_create, machen Besonderheit  machen (a_x_value: REAL; a_y_value: REAL)  tun  x : = a_x_value  y : = a_y_value  Ende  x: REAL  - x Koordinate  y: REAL  - y Koordinate  ... 

Im zweiten Snippet eine Klasse, die ein Kunde ist POINT hat Erklärungen my_point_1 und my_point_2 of type POINT.

Im Verfahrenskodex, my_point_1 wird als Ursprung erstellt (0,0, 0,0). Da kein Erstellungsverfahren angegeben ist, ist das Verfahren angegeben default_create von der Klasse geerbt ANY wird genutzt. Diese Zeile hätte codiert werden können create my_point_1.default_create . Nur als Erstellungsverfahren benannte Verfahren können in einer Anweisung mit dem verwendet werden create Stichwort. Als nächstes kommt ein Schöpfungsanweis für my_point_2Bereitstellung von Anfangswerten für die my_point_2Koordinaten. Die dritte Anweisung macht eine gewöhnliche Instanz an die make Verfahren zur Neuitialisierung der angehängten Instanz my_point_2 mit unterschiedlichen Werten.

  my_point_1: PUNKT  my_point_2: PUNKT  ...  schaffen my_point_1  schaffen my_point_2.machen (3.0, 4.0)  my_point_2.machen (5.0, 8.0)  ... 

F#

Im F#, ein Konstruktor kann alle enthalten Lassen oder tun Aussagen in einer Klasse definiert. Lassen Aussagen definieren private Felder und tun Anweisungen führen Code aus. Zusätzliche Konstruktoren können mit dem definiert werden Neu Stichwort.

Typ Meine Klasse(_a : int, _b : Saite) = Klasse  // Primärkonstruktor  Lassen a = _a  Lassen b = _b  tun printfn "a = %i, b = %s" a b  // Zusätzliche Konstruktoren  Neu(_a : int) = Meine Klasse(_a, "" ") dann  printfn "Ganzzahlparameter gegeben"  Neu(_b : Saite) = Meine Klasse(0, _b) dann  printfn "String -Parameter gegeben"  Neu() = Meine Klasse(0, "" ") dann  printfn "Kein Parameter gegeben" Ende 
// irgendwo Code // ein Objekt mit dem primären Konstruktor instanziieren Lassen C1 = Neu Meine Klasse(42, "String") // ein Objekt mit zusätzlichen Konstruktoren instanziiert Lassen C2 = Neu Meine Klasse(42) Lassen C3 = Neu Meine Klasse("String") Lassen C4 = Meine Klasse() // "neues" Schlüsselwort ist optional 

Java

Im JavaKonstruktoren unterscheiden sich von anderen Methoden darin:

  • Konstruktoren haben nie einen expliziten Rückgabetyp.
  • Konstruktoren können nicht direkt aufgerufen werden (das Schlüsselwort "Neu”Ruft sie an).
  • Konstruktoren sollten keine nicht zugänglichen Modifikatoren haben.

Java -Konstruktoren führen in der folgenden Reihenfolge die folgenden Aufgaben aus:

  1. Rufen Sie den Standardkonstruktor der Superklasse auf, wenn kein Konstruktor definiert ist.
  2. Initialisieren Sie die Elementvariablen in die angegebenen Werte.
  3. Führt den Körper des Konstruktors aus.

Mit Java können Benutzer einen Konstruktor in einem anderen Konstruktor verwenden Dies() Stichwort. Aber Dies() Muss die erste Aussage sein. [9]

Klasse Beispiel {   Beispiel() // nicht parametrisierter Konstruktor  {  Dies(1);  // Aufruf des Konstruktors  System.aus.println("0-Arg-cons");  }  Beispiel(int a) // Parametrisierter Konstruktor  {  System.aus.println("1-Arg-cons");  } } Öffentlichkeit statisch Leere hauptsächlich(Saite[] Args) {  Beispiel e = Neu Beispiel(); } 

Java bietet Zugriff auf die Superklasse Konstruktor durch die super Stichwort.

Öffentlichkeit Klasse Beispiel {  // Definition des Konstruktors.  Öffentlichkeit Beispiel()  {  Dies(1);  }  // einen Konstruktor überladen  Öffentlichkeit Beispiel(int Eingang)  {  Daten = Eingang; // Dies ist eine Aufgabe  }  // Deklaration der Instanzvariablen (en).  Privatgelände int Daten; } 
// Code woanders // ein Objekt mit dem obigen Konstruktor instanziiert Beispiel e = Neu Beispiel(42); 

Ein Konstruktor, der keine Anzahl von Argumenten nimmt, wird als "No-Argumente" oder "No-Arg" -Konstruktor bezeichnet.[10]

JavaScript

Ab ES6, JavaScript Hat direkte Konstruktoren wie viele andere Programmiersprachen. Sie sind als solche geschrieben

Klasse Foobar {  Konstrukteur(Baz) {  Dies.Baz = Baz  } } 

Dies kann als solche instanziiert werden

Const Foo = Neu Foobar('7') 

Das Äquivalent davon vor ES6 war eine Funktion, die ein Objekt als solches instanziiert

Funktion Foobar (Baz) {  Dies.Baz = Baz; } 

Dies ist so instanziiert, wie oben.

Objekt Pascal

Im Objekt PascalDer Konstruktor ähnelt a Fabrikmethode. Der einzige syntaktische Unterschied zu regulären Methoden ist das Schlüsselwort Konstrukteur vor dem Namen (statt Verfahren oder Funktion). Es kann einen Namen haben, obwohl die Konvention haben soll Schaffen als Präfix wie in CreatewithFormating. Das Erstellen einer Instanz einer Klasse funktioniert wie eine statische Methode einer Klasse: Tperson.create ('Peter').

Programm Oopprogramm; Typ  Tperson = Klasse  Privatgelände  Fname: Saite;  Öffentlichkeit  Eigentum Name: Saite lesen Fname;  Konstrukteur Schaffen(Ein Name: Saite);  Ende; Konstrukteur Tperson.Schaffen(Ein Name: Saite); Start  Fname : = Ein Name; Ende; var  Person: Tperson; Start  Person : = Tperson.Schaffen('Peter'); // Zuordnet eine Instanz von tperson zu und ruft dann tperson.create mit dem Parameter Aname = 'Peter' auf. Ende. 

Ocaml

Im OcamlEs gibt einen Konstruktor. Parameter werden direkt nach dem Klassennamen definiert. Sie können verwendet werden, um Instanzvariablen zu initialisieren und sind in der gesamten Klasse zugänglich. Eine anonyme versteckte Methode genannt Initialisierer Ermöglicht die Bewertung eines Ausdrucks unmittelbar nach dem Erstellen des Objekts.[11]

Klasse Person Vorname Nachname =  Objekt  val vollständiger Name = Vorname ^ "" " ^ Nachname  Initialisierer  print_endline("Hallo, ich bin" ^ vollständiger Name ^ ".")  Methode get_last_name = Nachname  Ende;; Lassen Alonzo = Neu Person "Alonzo" "Kirche" in (*Hallo, ich bin Alonzo -Kirche.*) print_endline Alonzo#get_last_name (*Kirche*) 

Php

Im Php Version 5 und höher ist der Konstruktor eine Methode mit dem Namen __konstruieren() (Beachten Sie, dass es sich um einen doppelten Unterstrich handelt), das das Schlüsselwort Neu Ruft nach dem Erstellen des Objekts automatisch auf. Es wird normalerweise verwendet, um Initialisierungen wie Eigenschafteninitialisierungen automatisch durchzuführen. Konstrukteure können auch Argumente akzeptieren, in diesem Fall, wenn die Neu Die Erklärung ist geschrieben, Sie müssen auch die Konstruktorargumente für die Parameter senden.[1]

Klasse Person {  Privatgelände Saite $ name;  Öffentlichkeit Funktion __konstruieren(Saite $ name): Leere  {  $ das->Name = $ name;  }  Öffentlichkeit Funktion GetName(): Saite  {  Rückkehr $ das->Name;  } } 

Beachten Sie, dass in PHP eine Klasse nur maximal eine Konstruktormethode deklarieren darf. Statische Methoden, Fabrikklassen oder optionale Konstruktorargumente sind einige Möglichkeiten, um mehrere Möglichkeiten zu ermöglichen, Objekte einer PHP -Klasse zu erstellen.

Perl 5

Im Perl Programmiersprache Version 5 standardmäßig sind Konstruktoren Fabrikmethoden, das heißt, Methoden, die das Objekt erstellen und zurückgeben und konkret eine gesegnete Referenz erstellen und zurückgeben. Ein typisches Objekt ist ein Hinweis auf einen Hash, obwohl selten auch Hinweise auf andere Typen verwendet werden. Nach Übereinkommen wird der einzige Konstruktor benannt Neu, obwohl es es sonst benennen kann oder mehrere Konstruktoren haben. Zum Beispiel kann eine Personklasse einen Konstruktor namens namens haben Neu sowie ein Konstruktor new_from_file die eine Datei für Personattribute liest und new_from_person Dies verwendet ein anderes Personobjekt als Vorlage.

Paket Person; # In Perl -Konstruktoren werden nach Übereinkommen als "neu" bezeichnet. Sub Neu {  # Klassenname wird implizit als 0. Argument übergeben.  mein $ Klasse = Wechsel;  # Standardattributwerte, wenn Sie welche haben.  mein %Standard = ( Foo => "Bar" );  # Initialisieren Sie Attribute als Kombination aus Standardwerten und Argumenten, die übergeben wurden.  mein $ sich selbst = { %Standard, @_ };  # Prüfen Sie, ob erforderliche Argumente, Klasseninvariante usw.  wenn ( nicht definiert $ sich selbst->{Vorname} ) {  sterben "Obligatorisches Attribut, das persönlich fehlt-> new (): first_name";  }  wenn ( nicht definiert $ sich selbst->{Nachname} ) {  sterben "Obligatorisches Attribut, das persönlich fehlt-> new (): last_name";  }  wenn ( definiert $ sich selbst->{das Alter} und $ sich selbst->{das Alter} < 18 ) {  sterben "Ungültiger Attributwert persönlich-> new (): Alter <18";  }  # Perl lässt ein Objekt einer Klasse von 'Bless' gehören.  segnen $ sich selbst, $ Klasse;  Rückkehr $ sich selbst; } 1; 

Perl 5 mit Elch

Mit dem Elchobjektsystem Für Perl kann der größte Teil dieser Kesselplatte ausgelassen werden, ein Standard Neu Es wird erstellt, Attribute können angegeben werden und ob sie festgelegt, zurückgesetzt werden oder erforderlich sind. Darüber hinaus kann jede zusätzliche Konstruktor -Funktionalität in a enthalten werden BAUEN Methode, die der Moose generierte Konstruktor aufruft, nachdem er die Argumente überprüft hat. EIN Buildargs Die Methode kann angegeben werden, um Konstruktorargumente nicht in Hashref / Key => Wertformular zu verarbeiten.

Paket Person; # Aktivieren Sie die Objektkonstruktion im Moose-Stil verwenden Elch; # Vorname (eine Zeichenfolge) kann nur zur Bauzeit festgelegt werden ('RO') hat Vorname => (ist => 'Ro' ', ist ein => 'Str', erforderlich => 1); # Nachname (eine Zeichenfolge) kann nur zur Bauzeit festgelegt werden ('RO') hat Nachname  => (ist => 'Ro' ', ist ein => 'Str', erforderlich => 1); # Alter (Ganzzahl) kann nach dem Bau ('RW') modifiziert werden und ist nicht erforderlich # zum Konstruktor übergeben werden. Erstellt auch eine "has_age" -Methode, die zurückgibt # wahr, wenn das Alter festgelegt wurde hat das Alter  => (ist => 'rw', ist ein => 'Int', Prädikat => 'Has_age'); # Die benutzerdefinierten Anforderungen überprüfen Sub BAUEN {  mein $ sich selbst = Wechsel;  wenn ($ sich selbst->Has_age && $ sich selbst->das Alter < 18) { # NEIN UNTER 18SS  sterben "Keine U18-Personen";  } } 1; 

In beiden Fällen wird die Personklasse so eingerichtet:

verwenden Person; mein $ p = Person->Neu( Vorname => 'Sam', Nachname => 'Als er', das Alter => 42 ); 

Python

Im Python, Konstruktoren werden von einem oder beiden definiert __Neu__ und __drin__ Methoden. Eine neue Instanz wird erstellt, indem die Klasse so aufgerufen wird, als wäre es eine Funktion, die die aufruft __Neu__ und __drin__ Methoden. Wenn in der Klasse eine Konstruktormethode nicht definiert ist, ist die nächste in der Klasse gefunden Methodenauflösungsreihenfolge wird angerufen werden.[12]

Im typischen Fall nur die __drin__ Methode muss definiert werden. (Die häufigste Ausnahme ist für unveränderliche Objekte.)

>>> Klasse Beispielpleclass: ...   def __Neu__(Cls, Wert): ...   drucken("Neue Instanz erstellen ...") ...   # Rufen Sie den Superclass -Konstruktor an, um die Instanz zu erstellen. ...   Beispiel = super(Beispielpleclass, Cls).__Neu__(Cls) ...   Rückkehr Beispiel ...   def __drin__(selbst, Wert): ...   drucken("Initialisierungsinstanz ...") ...   selbst.Nutzlast = Wert >>> Beispielinstanz = Beispielpleclass(42) Neue Instanz erstellen ... Initialisierungsinstanz ... >>> drucken(Beispielinstanz.Nutzlast) 42 

Klassen wirken normalerweise als Fabriken Für neue Fälle von sich selbst, dh eine Klasse, ist ein Callable -Objekt (wie eine Funktion), wobei der Anruf der Konstruktor ist und der Aufruf der Klasse eine Instanz dieser Klasse zurückgibt. Jedoch das __Neu__ Die Methode dürfte etwas anderes als eine Instanz der Klasse für spezielle Zwecke zurückgeben. In diesem Fall die __drin__ wird nicht aufgerufen.[13]

Raku

Mit Rakunoch mehr Kesselplatte kann ausgelassen werden Neu Die Methode wird vererbt, Attribute können angegeben werden und ob sie festgelegt, zurückgesetzt werden oder erforderlich sind. Darüber hinaus kann jede zusätzliche Konstruktor -Funktionalität in a enthalten werden BAUEN Methode, die aufgerufen wird, um eine benutzerdefinierte Initialisierung zu ermöglichen. EIN Optimieren Die Methode kann angegeben werden, um alle bereits (implizit) initialisierten Attribute nachzuarbeiten.

Klasse Person { hat Str $. Erster Name ist erforderlich; # Vorname (eine Zeichenfolge) kann nur auf eingestellt werden  # Bauzeit (die. bedeutet "öffentlich").  hat Str $ .last-name ist erforderlich; # Nachname (eine Zeichenfolge) kann nur auf eingestellt werden  # Bauzeit (a! würde "privat" bedeuten).  hat Int $ .age ist rw; # Alter (eine Ganzzahl) kann danach geändert werden   # Konstruktion ('RW') und ist nicht erforderlich  # Während der Objekt -Instanziierung.       # Erstellen Sie eine "Vollname" -Methode, die den vollständigen Namen der Person zurückgibt.  # Diese Methode kann außerhalb der Klasse zugegriffen werden.  Methode vollständiger Name { $! Erster Name.TC ~ "" " ~ $! Last-Namen.TC } # Erstellen Sie eine "HAS-Age" -Methode, die true zurückgibt, wenn das Alter festgelegt wurde.  # Diese Methode wird nur in der Klasse verwendet, sodass sie als "privat" deklariert wird  # Durch die Vorbereitung seines Namens mit einem!  Methode!Has-Alter { selbst.das Alter.definiert } # Die benutzerdefinierten Anforderungen überprüfen  Methode Optimieren { wenn selbst!Has-Alter && $! Alter < 18 { # Nein unter 18  sterben "Keine Person unter 18"; }}}

Die Personklasse wird so instanziiert:

mein $ p0 = Person.Neu( Vorname => 'Sam', Nachname => 'Als er', das Alter => 42 );mein $ P1 = Person.Neu( Vorname => 'Anmut', Nachname => 'Trichter' );sagen $ P1.vollständiger Name(); # Ausgabe: «Grace Hopper␤» 

Alternativ die Namens Parameter kann unter Verwendung der Dickdarm-Pair-Syntax in Perl 6 angegeben werden:

mein $ p0 = Person.Neu(::Vorname:::Nachname:::das Alter(42));mein $ P1 = Person.Neu(::Vorname:::Nachname );

Und sollten Sie Variablen mit Namen eingerichtet haben, die mit den benannten Parametern identisch sind Name der Variablen für den benannten Parameter:

mein $ Erstname = "Sam";mein $ Last-Namen  = "Als er";mein $ Alter        = 42;mein $ p0 = Person.Neu(::$ Erstname:::$ Last-Namen:::$ Alter );

Rubin

Im Rubin, Konstruktoren werden erstellt, indem eine Methode genannt wird initialisieren. Diese Methode wird ausgeführt, um jede neue Instanz zu initialisieren.

IRB (Haupt): 001: 0> Klasse Beispielpleclass IRB (Haupt): 002: 1>   def initialisieren IRB (Haupt): 003: 2>   stellt "Hallo" IRB (Haupt): 004: 2>   Ende IRB (Haupt): 005: 1> Ende => nil IRB (Haupt): 006: 0> Beispielpleclass.Neu Hallo => #<BeispielPleClass: 0x007FB3F4299118> 

Visual Basic .net

Im Visual Basic .net, Konstruktoren verwenden eine Methodendeklaration mit dem Namen "Neu".

Klasse Foobar  Privatgelände Strdata Wie Saite  ' Konstrukteur  Öffentlichkeit Sub Neu(Byval irgendein Parparam Wie Saite)  Strdata = irgendein Parparam  Ende Sub Ende Klasse 
'Code woanders 'Instanzipiieren eines Objekts mit dem obigen Konstruktor Schwach Foo Wie Neu Foobar(".NETZ") 

Siehe auch

Anmerkungen

  1. ^ Eiffel Routinen sind entweder Verfahren oder Funktionen. Verfahren haben nie einen Rückgabetyp. Funktionen haben immer einen Rückgabetyp.
  2. ^ Da die ererbte Klasseninvariante zufrieden sein muss, gibt es keinen obligatorischen Anruf bei den Konstruktoren der Eltern.
  3. ^ Der Eiffelstandard muss bei den ersten Zugriffszusagen initialisiert werden. Daher ist es nicht erforderlich, die Standardfeldinitialisierung während der Objekterstellung durchzuführen.

Verweise

  1. ^ a b c Konstrukteure und Zerstörer, aus PHP -Online -Dokumentation
  2. ^ Datenmodell, aus Python Online -Dokumentation
  3. ^ https://stackoverflow.com/questions/1242830/constructor-initialization-list-evaluation-bestellt Konstrukteur
  4. ^ "Fabelhafte Abenteuer in der Codierung". Eric Lippert. 2013-02-06. Abgerufen 2014-04-05.
  5. ^ Experte .NET 2.0 IL Assembler.Apress.2006-01-01. ISBN 9781430202233. Abgerufen 2014-04-05.
  6. ^ Statischer Konstruktor in C# auf MSDN
  7. ^ Component
  8. ^ Eiffel ISO/ECMA -Spezifikationsdokument
  9. ^ Details zum Konstruktor in Java
  10. ^ "Bereitstellung von Konstruktoren für Ihre Klassen".Oracle Corporation.2013. Abgerufen 2013-12-20.
  11. ^ OCAML -Handbuch
  12. ^ Datenmodell
  13. ^ Datenmodell