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...
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")
{
}
}
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. 🙂
Der Auszug aus dem Buch stimmt nach wie vor.
Allerdings ist es nicht zwingend erforderlich, dass eine Klasse einen "standard" Konstruktor ohne Parameter hat.
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
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.
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!”
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.
Danke für die Erläuterungen,
jetzt habe ich es vollkommen verstanden. 👅