Entwickler-Ecke
C# - Die Sprache - "ClassB" enthält keinen Konstruktor der 1-Argumente enthält.
Delete - Sa 31.07.10 01:24
Titel: "ClassB" enthält keinen Konstruktor der 1-Argumente enthält.
Ich habe folgende Klassen:
Class A:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| public abstract class ClassA { private SomeClass Owner;
public ClassA() { }
public ClassA(SomeClass Owner) : this() { this.Owner = Owner; } } |
Class B:
C#-Quelltext
1: 2: 3: 4:
| public class ClassB : ClassA { } |
Class C:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| public class ClassC : SomeClass { private ClassB Child;
public ClassC() { this.Child = new ClassB(this); } } |
Ich kann nicht nachvollziehen, warum er den Konstruktor mit 1 Argument aus ClassA in ClassB nicht finden kann. Könnt ihr das nachvollziehen?
Danke
Christian
Delete - Sa 31.07.10 02:31
Ich habe ClassB erst einmal um zwei Konstruktoren erweitert, damit ich weiterarbeiten kann.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| public class ClassB : ClassA { public ClassB() :base() { }
public ClassB(SomeClass Owner) :base(Owner) { } } |
Das kann doch aber nicht die Lösung sein. Die zwei Konstruktoren aus ClassA sollten doch nach ClassB vererbt worden sein, oder denke ich da falsch?
Gruß
Christian
Th69 - Sa 31.07.10 09:43
Ja, du denkst falsch -) Die Konstruktoren werden niemals vererbt. Einzige Ausnahme ist, daß wenn kein Konstruktor angegeben wird, ein Standardkonstruktor vom Compiler erzeugt wird, welcher dann den ebenfalls parameterlosen Basiskonstruktor aufruft.
Wenn aber die Basisklasse über keinen parameterlosen Konstruktor verfügt, dann muß immer ein eigener Konstruktor in den abgeleiteten Klassen erstellt werden (welcher entweder die selben Parameter hat oder aber konstante Werte an den Konstruktor der Basisklasse weitergibt).
In deinem Beispiel also hättest du nur den (vom Compiler erstellten) parameterlosen Konstruktor der Klasse B zur Verfügung - und somit ist die Fehlermeldung korrekt -)
danielf - Sa 31.07.10 10:19
Hallo,
versuchst du damit ein bestehendes Problem zu lösen oder willst du es für dich einfach nur erforschen?
Für dein Problem könnten generische Klasse die Lösung sein. Dafür müsstest du uns aber erzählen, was du eigentlich bezwecken willst :)
Gruß
Kha - Sa 31.07.10 13:36
Als Delphi-Entwickler sollten dir die Probleme der Konstruktor-Vererbung eigentlich bekannt sein: Manchmal ist es äußerst nützlich, eine Klasse von außen nicht instanzierbar zu machen, also nur einen privaten Konstruktor anzulegen. Da TObject/System.Object aber einen öffentlichen Konstruktor besitzt, kann das nur ohne Konstruktor-Vererbung funktionieren.
Delete - Mo 02.08.10 12:19
Th69 hat folgendes geschrieben : |
Einzige Ausnahme ist, daß wenn kein Konstruktor angegeben wird, ein Standardkonstruktor vom Compiler erzeugt wird, welcher dann den ebenfalls parameterlosen Basiskonstruktor aufruft. |
Was folgendes erklärt.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| class ClassA { public ClassA() { MessageBox.Show("ClassA"); } }
class ClassB { public ClassB() : base() { } }
ClassB ClB; ClB = new ClassB(); |
danielf hat folgendes geschrieben : |
versuchst du damit ein bestehendes Problem zu lösen oder willst du es für dich einfach nur erforschen? |
Ich habe ein bestimmtes Problem, das ich nicht mit Generics beheben kann.
Kha hat folgendes geschrieben : |
Als Delphi-Entwickler sollten dir die Probleme der Konstruktor-Vererbung eigentlich bekannt sein: Manchmal ist es äußerst nützlich, eine Klasse von außen nicht instanzierbar zu machen, also nur einen privaten Konstruktor anzulegen. Da TObject/System.Object aber einen öffentlichen Konstruktor besitzt, kann das nur ohne Konstruktor-Vererbung funktionieren. |
Ich verstehe jetzt nicht, was das mit de Sichtbarkeit zu tun haben soll? Ich kann in ClassA eine Methode als public deklarieren. Wenn ich in ClassB die Sichtbarkeit ändern z. B. in public ändern will, dann muss ich diese Methode ebenso neu definieren. Das wäre beim Konstrultor genauso. Und in beiden Fällen könnte die Vererbung eingesetzt werden (unabhängig der realen Verhältnisse).
Kha - Mo 02.08.10 19:32
Neurologic Scientist hat folgendes geschrieben : |
Wenn ich in ClassB die Sichtbarkeit ändern z. B. in public ändern will, dann muss ich diese Methode ebenso neu definieren. Das wäre beim Konstrultor genauso. |
Sichtbarkeit lässt sich aber immer nur erhöhen, nicht heruntersetzen. Und deshalb kann es Klassen mit rein privaten Konstruktoren nur in Sprachen ohne Konstruktor-Vererbung geben.
Delete - Mi 04.08.10 08:38
Ok. Dann nehme ich das so an.
Danke für die Infos.
Christian
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!