Autor |
Beitrag |
Christian R.
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 31.07.10 01:24
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
|
|
Christian R.
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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.
_________________ >λ=
|
|
Christian R.
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 02.08.10 12:19
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 02.08.10 19:32
Christian R. 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.
_________________ >λ=
|
|
Christian R.
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 04.08.10 08:38
Ok. Dann nehme ich das so an.
Danke für die Infos.
Christian
|
|