You are not logged in.


Joris

Power Clubber

  • "Joris" started this thread

Posts: 662

Occupation: Student der Rechtswissenschaften

  • Send private message

1

Monday, April 21st 2008, 10:34pm

Implizite Konvertierungsoperatoren

Einer Klasse direkt Werte zuweisen

Als ich neulich eine Klasse geschrieben habe, wollte ich meinem Klassenobjekt über den =-Operator einen Wert zuweisen. Ich habe

erstmal ganz naiv folgendes getan:

Source code

1
2
3
4
5
6
7
8
9
class MyClass
{
public int GlobalerInteger;
}

class TestMyClass
{
MyClass mc = 12;
}


Was passierte ahnt ihr sicherlich schon, richtig, ein Laufzeitfehler:

Quoted

Eine implizite Konvertierung vom Typ "int" in "MyClass" ist nicht möglich. C:\....

Ärgerlich, aber was soll man machen. Es ist ja auch eigentlich nur logisch. Woher soll der Compiler auch wissen, was er mit dem Integer tun soll, der der Klasse zugeordnet wird? Zuerst war ich betrübt. Ich dachte ich müsste den Wert jetzt ganz 'uncool' über einen direkten Verweis auf die Variable GlobalerInteger zuweisen.

Source code

1
2
3
4
5
6
7
8
9
10
11
 class MyClass
{
public int GlobalerInteger;
}

class TestMyClass
{
MyClass mc;

mc.GlobalerInteger = 12;
}
Da ich dass aber unter keinen Umständen so umsetzen wollte, suchte ich weiter. Nachdem ich eine ganze Weile gesucht hatte, fand ich einen MSDN Artikel über implizite Konvertierungsoperatoren. Dieser Artikel hielt die Lösung für mein Problem bereit.
In dem Artikel wird beschrieben, was die Klasse tun soll, wenn ihr direkt ein Wert zugewiesen wird, also eine implizite Konvertierung.

Die allgemeine Struktur des Operators sieht folgendermaßen aus:

Source code

1
2
3
4
 public static implicit operator <Datentyp>(<Klassenobjekt> <Parameter>)
{
return new <KlassenObjekt>(<Parameter>); 
 }



Hier muss eine Neue Instanz gebildet werden, weil aus einer <static> Methode nicht direkt auf Eigenschaften der Klasse zurückgreifen können. Damit diese Methode funktioniert benötigt man natürlich noch einen Konstruktor für die Klasse:

Source code

1
2
3
4
public void <Klassenname>(<Datentyp> <Parameter>)
{
this.<KlassenVariable> = <Parameter>;
}


In meinem Fall sah das ganze dann so aus:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 class MyClass
{
public int GlobalerInteger;

public void MyClass(int value)
{
this.GlobalerInteger = value;
}

public static implicit operator int(MyClass value)
{
return new MyClass(value);
}

}

class TestMyClass
{
MyClass mc = 12;
}


Jetzt endlich funktionierte es. Natürlich lässt sich das ganze auch mit allen anderen Datentypen machen. Und auch umgekehrt. Wenn ich zum Beispiel durch mein Klassenobjekt einem beliebigen Datentyp einen Wert aus meiner Klasse zuweisen möchte:

Source code

1
2
3
4
 public static implicit operator <Klassenobjekt>(<Datentyp> <Parameter>)
{
return this.<DerWert,DerDerEinerKlassenVariableZugewiesenwerdenSoll> = <parameter>;
 }



Hier der bisherige Programmcode:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 class MyClass
{
public int GlobalerInteger;

public void MyClass(int value)
{
this.GlobalerInteger = value;
}

public static implicit operator int(MyClass value)
{
return new MyClass(value);
}

public static implicit operator MyClass(int value)
{
return this.GlobalerInteger = value;
}


}

class TestMyClass
{
MyClass mc = 12;
int i = mc; // i -> 12

}


Das war eine kleine Einführung in die impliziten Konvertierungsoperatoren. Ich hoffe es hat euch gefallen und vielleicht bei eurem einen oder anderem Problem weitergeholfen.

Viele Grüße

Joris
Nemo plus iuris transferre potest quam ipse habet.

Social bookmarks

Rate this thread