PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Konstruktor ruft Konstruktor auf: C#


Godmode
2005-07-29, 10:46:51
Ich habe eine Klasse mit 2 Konstruktoren und der 2. sollte den ersten aufrufen, wie mache ich das?

public class A
{
..public A(string a)
..{
....//code, code code
..}
..public A(string a, int b)
..{
....rufe den ersten Konstruktor auf
....mache irgendwas mit b
..}
}

Ich hoffe ihr wisst jetzt was ich meine, danke im voraus.

Katano
2005-07-29, 10:50:22
probier ma

this.A(a);

sollte eigentlich klappen...

Godmode
2005-07-29, 10:52:41
probier ma

this.A(a);

sollte eigentlich klappen...

hätte ich auch gedacht, mag er aber nicht :confused:

Katano
2005-07-29, 11:00:37
komisch

The this keyword refers to the current instance of the class. Static member functions do not have a this pointer. The this keyword can be used to access members from within constructors, instance methods, and instance accessors.

Quelle: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrfthispg.asp

hast auch ma ohne this versucht? also einfach
A(a);
?

Godmode
2005-07-29, 11:02:53
habs schon, so gehts:
..public A(string a, int b) : this(a)
..{
....rufe den ersten Konstruktor auf
....mache irgendwas mit b
..}

Ganon
2005-07-29, 11:02:59
Ich kenne jetzt C# nicht so genau, aber müsste das nicht funktionieren?


public class A
{
public A(string a)
{
//code, code code
}

public A(string a, int b)
{
super(a);
b = 2;
}
}

Gnafoo
2005-07-29, 11:03:49
@Ganon würde super nicht versuchen, den Konstruktor der Basisklasse aufzurufen? (Die gibt es hier ja nicht)

Katano
2005-07-29, 11:06:35
habs schon, so gehts:
..public A(string a, int b) : this(a)
..{
....rufe den ersten Konstruktor auf
....mache irgendwas mit b
..}

C# is echt faszinierend... muss ich umbedingt ma lernen ;)

Ganon
2005-07-29, 11:09:53
@Der Tod
Sollte er dann nicht die selbe Klasse nehmen?


Naja. Wäre aber nett, wenn mir mal einer das:

public A(string a, int b) : this(a)
{
...
}

erklären könnte...

Demirug
2005-07-29, 11:17:09
Wo ist da jetzt das Problem?

Der Syntax von C# definiert nun mal das man so aus einem Konstruktor einen anderen in der gleichen Klasse aufrufen kann.

Gnafoo
2005-07-29, 11:31:01
@Ganon ich weiß jetzt was C# angeht nicht 100% bescheid, aber bei C++ gibt es etwas ähnliches. Angenommen man hat eine Klasse C, die Instanzen der Klasse A und B speichert. Nun möchte man an den Konstruktor von A und B einen Parameter übergeben, ohne mit Pointern und new arbeiten zu müssen. Dann geht das so:


class A
{
public:
A(int a)
{
// ...
}
};

class B
{
public:
B(int b)
{
// ...
}
};

class C
{
private:
A _a;
B _b;

public:
C(void) : _a(5), _b(6)
{
// ...
}
}


Bei C# ist das oben eigentlich nur die logische Weiterführung auf die Klasse selber, indem man nun bei ihr, anstatt bei _a oder _b den Konstruktor aufruft.

Ganon
2005-07-29, 11:39:04
Vielen Dank für die Erklärung. :)

Wusste ich nicht das das geht. Wieder was gelernt. :)

HellHorse
2005-07-29, 13:16:27
@Der Tod
Sollte er dann nicht die selbe Klasse nehmen?
Ich kenne C# nicht im Detail, dürfte er aber imho nicht machen, da super statisch gebunden ist.

Ganon
2005-07-29, 13:23:40
OK. Kann auch sein das ich das aus Objective-C falsch sehe. Dort hat ja jede Klasse ein "Überobjekt" von dem immer abgeleitet wird.

Gnafoo
2005-07-29, 13:41:56
Ich würde sagen Super gibt es gar nicht so, wie Ganon es angewendet hat. Zumindest spuckt mit C# beim kompilieren Folgendes aus:
"Der Name 'super' besteht nicht in der Klasse oder dem Namespace..."

Ansonsten ist die Superklasse bei Ganons Beispiel wohl "Object":

"Unterstützt sämtliche Klassen in der Hierarchie von .NET Framework-Klassen und stellt abgeleiteten Klassen Low-Level-Dienste zur Verfügung. Dies ist die allen Klassen von .NET Framework übergeordnete Basisklasse und stellt den Stamm der Typhierarchie dar."

ScottManDeath
2005-07-29, 14:04:31
super in Java == base in C#

HellHorse
2005-07-29, 16:03:31
OK. Kann auch sein das ich das aus Objective-C falsch sehe. Dort hat ja jede Klasse ein "Überobjekt" von dem immer abgeleitet wird.
Ja schon, aber darum ging es mir nicht. super (resp. base) ist fundamental anders als this/self. Denn super ist statisch (zur Compilezeit) gebunden (zumindest in allen Sprachen, die ich kenne). Dadurch ist es unmöglich dass durch super eine Methode (oder Konstruktor) in der aktuellen Klasse aufgerufen wird.
Hier ist das Aufrufen eines anderen Konstruktors in Java/C# mittels this() verwirrend, denn es ist auch statisch gebunden.