Autor Beitrag
Christian R.
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 31.07.10 01:24 
Ich habe folgende Klassen:

Class A:
ausblenden 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()
  {
    // Initialisierung
  }

  public ClassA(SomeClass Owner)
    : this()
  {
    this.Owner = Owner;
  }
}


Class B:
ausblenden C#-Quelltext
1:
2:
3:
4:
public class ClassB : ClassA
{
  // Einige Erweiterungen
}


Class C:
ausblenden 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);
    // Fehler CS1729: "ClassB" enthält keinen Konstruktor der 1-Argumente enthält.
  }
}


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



BeitragVerfasst: Sa 31.07.10 02:31 
Ich habe ClassB erst einmal um zwei Konstruktoren erweitert, damit ich weiterarbeiten kann.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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



BeitragVerfasst: Mo 02.08.10 12:19 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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.

ausblenden 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
{
  // vom Compiler im Hintergrund erzeugter Konstruktor
  public ClassB()
    : base()
  {
  }
}

ClassB ClB;
ClB = new ClassB();
// erzeugt Ausgabe "ClassA"

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 02.08.10 19:32 
user profile iconChristian R. hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: Mi 04.08.10 08:38 
Ok. Dann nehme ich das so an.

Danke für die Infos.

Christian