2017-07-04 3 views
-3

Gestern habe ich PHP-Kurse gelesen und plötzlich wurde mir etwas seltsam. Und das war über Konstruktoren in C# und PHP.Was genau machen Konstrukteure?

Meine Frage ist, was ist Konstruktor? Ist es nicht eine spezielle Methode, die verwendet wird, wenn eine Klasse instanziiert wird, die so etwas wie eine Methode ausführen kann und notwendige Ressourcen für Klassen wie Memory und etc braucht? Und wenn es zum Beispiel eine Elternklasse namens A gibt, die wir eine andere Klasse namens B ableiten und eine Instanz von B erstellen und den B-Konstruktor aufrufen und einige Argumente an sein Elternelement (A) senden, verwenden wir: base (args.) (in C#) und benutze parent :: __ construct (args) (in PHP), also geht es und rufe den Elternkonstruktor auf, wir wollen nicht genau Ressourcen für das Elternelement nehmen, aber wir rufen einfach den Elternkonstruktor auf, der es tut für uns. Was passiert genau hier?

Ich schätze in diesem Fall einfach nur wie eine Funktion! : \ Ich weiß nicht, ich meine selbst klar ist oder nicht ... Frag mich bitte, wenn es irgendeine Mehrdeutigkeit ist, und Dank;)

Thank AKTUALISIERT von mir die negative Votum der Art und Weise geben ... siehe diesen Link: Microsoft Docs Soweit ich hier lese es ist etwas mehr als eine einfache Funktion, die einen Block von Codes halten. (Aber mit Unterschieden, die Sie sagten, kein Rückgabewert und etc.) wenn es nur eine Funktion ist welches aufgerufen wird, wenn eine Instanz erstellt wird, warum also, wenn wir es privat machen, können wir keine Instanz mehr daraus machen? Warum, wenn wir eine Klasse erstellen wollten, füge a() am Ende des Klassennamens hinzu und wenn wir irgendwelche Argumente an den Konstruktor übergeben wollen, benutze thes() um zu senden? [Person new_person = new Person();] wenn Sie denken, auch dies eine Frage, die keine Mühe nicht zeigt, eine Nein- Stimme wieder: D

+3

Ich denke du bist * im Grunde * da; es ist nur eine Initialisierungsmethode mit Semantik, die dies erzwingt - es gibt kein spezielles Voodoo, das mit einem Konstruktor weitergeht. und sie sind * im Grunde * nur Methoden, die Sie normalerweise nicht unabhängig aufrufen können ... –

+0

Siehe [C# Konstruktor Ausführungsreihenfolge] (https://stackoverflow.com/questions/1882692/c-sharp-constructor-execution-order) . Es gibt eine gute Antwort von Jon Skeet dort. –

Antwort

1

Ein Konstruktor ist im Grunde nur eine Funktion. Der Unterschied zwischen einer normalen Funktion und einem Konstruktor ist, dass ein Konstruktor

  1. verfügt nicht über einen Rückgabewert (nicht einmal void)
  2. wie die Klasse mit dem Namen selbst (oder hat einen vordefinierten speziellen Namen)
  3. wird als obligatorische Funktion klassifiziert, die ausgeführt werden muss, bevor das Objekt in einem benutzbaren Zustand ist
  4. kann nicht wie andere Funktionen aufgerufen werden

der Konstruktor wird automatisch aufgerufen, wenn creat eine neue Instanz des Objekts erstellen.

Update:

Um zu verstehen, warum Sie nicht eine neue Instanz von etwas mit einem privaten Konstruktor (von außen) schaffen betrachtet es als eine normale Funktion für einen Moment.
Wenn Sie von außerhalb der Klasse new ClassWithPrivateConstructor() aufrufen möchten, wird es nicht funktionieren, da Sie keinen Zugriff auf den Konstruktor haben.

Sie können jetzt denken, dass ein privater Konstruktor nutzlos ist.Aber das ist nicht der Fall. Es gibt gültige Fälle. Z.B. Singleton Objekte.

Und für die () denken Sie an einen Konstruktor als eine normale Funktion wieder. Sie möchten den Konstruktor aufrufen. Vielleicht sogar mit Argumenten. Deshalb benötigen Sie beim Erstellen einer neuen Instanz eines Objekts die ().

+0

Ich aktualisiere meine Frage ... Ich würde es schätzen, wenn Sie es wieder anschauen :) –

+0

Meine Antwort aktualisiert – Mischa

+0

Sie sagen, dass wenn wir wollen eine Klasse erstellen und diesen Ausdruck benutzen (new class_name();) wir rufen eigentlich den Konstruktor auf? –

1

Ein Konstruktor ist ein Codeblock ähnlich ein Verfahren, das ist Wird aufgerufen, wenn eine Instanz eines Objekts erstellt wird.

Ein Konstruktor hat keinen Rückgabetyp. Der Name des Konstruktors muss mit dem Namen der Klasse übereinstimmen.

+0

Ich aktualisiere meine Frage ... Ich würde es schätzen, wenn Sie es wieder anschauen :) –