Laden...

Vorsicht, Noobiefrage :)

Erstellt von towanda vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.546 Views
T
towanda Themenstarter:in
20 Beiträge seit 2005
vor 18 Jahren
Vorsicht, Noobiefrage :)

Hallo,

ich habe erst angefangen mich mit der OOP zu beschäftigen.
Mein erstes C# Buch habe ich fast durch.

Was ich komische finde ist folgendes:
Überall habe ich bzgl. einer Klassen-Syntax gelesen, dass wenn ich einen eigenen Konstruktor geschrieben habe, ich dann unbedingt einen Standardkonstruktor definieren muss !
Nur bei einer Struktur wäre es was anderes, da dort der Standardkonstruktor immer erstellt wird.

Doch in Visual Studio zb schreibe ich Programme (Windows Anwendung bzw. Konsolenanwendung), da habe ich mehrere eigene Konstruktoren und schreibe keinen Standardkonstruktor, trotzdem geht alles wunderbar.
Kurze Frage: Warum ? 🙂

Wie gesagt, absolute Anfängerfrage...

#
88 Beiträge seit 2005
vor 18 Jahren

Wenn du keinen Konstruktor schreibst fügt der Compiler einen lehren Compiler ohne Parameter hinzu.
Wenn du von einer Klasse erbst die nur Konstruktoren mit Parametern hat musst du aber mindestens einen Konstruktor schreiben (mit oder ohne Parameter ist egal) und einen Konstruktor aus der oberklasse aufrufen.
Konstruktoren werden nicht vererbt.

class Test
{
    public Test(string test)
    {
    }
}

class Test2 : Test
{
public Test2(string test2)
        : base(test2)
    {
    }
    public Test2()
        : base("foo")
    {
    }
}
T
towanda Themenstarter:in
20 Beiträge seit 2005
vor 18 Jahren

Original von #coder
Wenn du keinen Konstruktor schreibst fügt der Compiler einen lehren Compiler ohne Parameter hinzu.

Aha, ok, dann hat sich das wohl geändert, denn in meinem C# Buch (MS Press - 2002) steht:

...Da Sie einen eigenen Konstruktor für die Klasse Point erstellt haben, steuert der Compiler keinen Standard-Konstruktor mehr bei. Sie werden das Problem nun lösen, indem Sie einen eigenen Standard-Konstruktor erstellen. 🙂

#
88 Beiträge seit 2005
vor 18 Jahren

Der Auszug aus dem Buch stimmt nach wie vor.
Allerdings ist es nicht zwingend erforderlich, dass eine Klasse einen "standard" Konstruktor ohne Parameter hat.

B
198 Beiträge seit 2005
vor 18 Jahren

Stimmt, einen Standarkonstrukor ohne Parameter brauchst du nur wenn du folgendes schreiben willst...

MyObjekt O = new MyObjekt();

da brauchst du dann einen Konstruktor ohne Parameter....

wenn du es so schreiben willst:

MyObjekt O = new MyObjekt("Das ist ein String der in einem selbst erstellen Konstruktor zugewiesen wird);

dann brauchst du einen Konstruktor der als Parameter einen String will

T
towanda Themenstarter:in
20 Beiträge seit 2005
vor 18 Jahren

Ah ok danke, also im Grunde brauche ich dann einen Standardkonstruktor, wenn auch ein Objekt der Klasse instantiert wurde, der keine Parameter übergibt.

In der Literatur steht es aber oft so drin, als bräuchte man immer einen, sobald man einen eigenen Konstruktor mit Parametern deklariert.

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo towanda!

Also folgendermaßen:

Erstellst Du eine Klasse, KOMPLETT OHNE Konstruktoren (sehr unsinnig), dann fügt der Compiler einen Standardkonstruktor hinzu.

Sobald Du einen Konstruktor definierst, wird vom Compiler überhaupt kein Konstruktor hinzugefügt.

Das bedeutet, dass wenn Du einen nicht-Standardkonstruktor definierst, dass die Klasse dann keinen Standardkonstruktor besitzt.

Wo Standardkonstruktoren mehr oder weniger Vorgeschrieben sind, sind hauptsächlich GUI-Klassen, da sie vom Designer z.B. aufgerufen werden.

Sobald Du keine GUI Klassen definierst, benötigst Du auch keinen Standardkonstruktor mehr.

Also wenn in dem Buch steht, dass man unbedingt einen Standardkonstruktor definieren MUSS, dann ist das fachlich falsch. Wenn das Buch schreibt, es wäre empfehlenswert, dann ist das eine Richtlinie, an die man sich nicht halten muss 😉

Ciao
Noman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

S
8.746 Beiträge seit 2005
vor 18 Jahren

Das Verhalten ist auch logisch: Ein automatisch hinzugefügter Konstruktor ohne Parameter wäre eine mögliches "Sicherheitsloch" der Klasse. Wen man einen eigenen Konstruktor definiert, dann impliziert das auch immer, dass sich das Objekt anschließend in einem definierten Zustand befindet (Member initialisiert).

Ein automatischer Standardkonstruktur würde dies aufbrechen.

Bei einer Klasse ohne Konstruktor kann der Compiler annehmen, dass dieses Verhalten vom Entwickler der Klasse gewünscht ist.

T
towanda Themenstarter:in
20 Beiträge seit 2005
vor 18 Jahren

Danke für die Erläuterungen,
jetzt habe ich es vollkommen verstanden. 👅