Start
Unternehmen
Forschung
Business Solutions
Business Intelligence
Software-Technologien
Technologie-Beratung
Individual-Software

Comelio GmbH
Essen
Fon: +49(0)201-437517-0
Fax: +49(0)201-437517-10
info@comelio.com

Comelio GmbH
Berlin
Fon: +49(0)30-3640339-80
Fax: +49(0)30-3640339-89
info@comelio.com

Comelio GmbH
Hamburg
Fon: +49(0)40-20934996-0
Fax: +49(0)40-20934996-9
info@comelio.com

Comelio GmbH
Frankfurt
Fon: +49(0)69-17320683-0
Fax: +49(0)69-17320683-9
info@comelio.com

Comelio GmbH
München
Fon: +49(0)89-38156860-0
Fax: +49(0)89-38156860-9
info@comelio.com

Comelio GmbH
Stuttgart
Fon: +49(0)711-46051275-0
Fax: +49(0)711-46051275-9
info@comelio.com

Comelio GmbH
Leipzig
Fon: +49(0)341-3928790-0
Fax: +49(0)341-3928790-9
info@comelio.com

Comelio GmbH
Köln
Fon: +49(0)221-355337943-0
Fax: +49(0)221-355337943-9
info@comelio.com

Comelio GmbH
Düsseldorf
Fon: +49(0)211-63556420-0
Fax: +49(0)211-63556420-9
info@comelio.com

Comelio-Blog > C#.NET > Konvertierungen

Benutzerdefinierte Konvertierungen in C#.NET

C#.NET ermöglicht implizites und explizites Überladen von Konvertierungen. Dabei geht es um Umwandlungen von einem Datentyp in einen anderen. Dies könnten sowohl eigene Klassen und damit eigene Typen als auch bereits in C# vorhandene Typen wie int, long etc. oder auch im Framework vorhandene Klassen sein. Die Syntax sieht dabei fast genauso aus wie bei der Operatorüberladung. Lediglich die Anweisungen sind natürlich nicht auf Tests und Untersuchungen auslegt, sondern fokussieren das Erstellen des gewünschten Typs mit passenden und sinnvollen Werten.

Kontakt

Anrede* Herr Frau
Vorname*
Nachname*
Firma
E-Mail*
Tel-Nr.
Bereich*
Freitext

C#.NET - Operatorüberladung für Konvertierungen

Vielleicht haben Sie sich auch schon mal gefragt, wie man denn möglicht schnell und einfach nachvollziehen könnte, ob eine geometrische Form oder unser Punkt im Koordinatensystem größer oder kleiner als ein Vergleichsobjekt ist (Schulbeispiel). Vielleicht haben Sie sich aber auch schon mal der Programmierung Ihres letzten Webshops gefragt, wie man die Größe eines Einkaufswagens bestimmen kann, kamen auf den Gedanken, dass es wohl die Gesamtsumme sein muss und fragten sich dann sofort, warum man dies nur mit einer Testmethode, die einen Wahrheitswert zurückliefert, überprüfen kann. Schöner wäre ja eigentlich folgender Ausdruck gewesen: if (wagen1 > wagen2), d.h. die Verwendung eines handelsüblichen Operators, der allerdings selbstständig wissen müsste, was eigentlich bei einem Einkaufswagen zu addieren ist, um einen passenden Vergleich mit einem anderen Einkaufswagen durchzuführen. Genau dies lässt sich mit der Operatorüberladung programmieren.

Konvertierungen

Eine Möglichkeit ergibt sich durch implizites und explizites Überladen von Konvertierungen. Dabei geht es um Umwandlungen von einem Datentyp in einen anderen. Dies könnten sowohl eigene Klassen und damit eigene Typen als auch bereits in C# vorhandene Typen wie int, long etc. oder auch im Framework vorhandene Klassen sein. Die Syntax sieht dabei fast genauso aus wie bei der Operatorüberladung. Lediglich die Anweisungen sind natürlich nicht auf Tests und Untersuchungen auslegt, sondern fokussieren das Erstellen des gewünschten Typs mit passenden und sinnvollen Werten.

Im Beispiel gibt es, von einer Klasse Koerper abgeleitet, zwei Unterklassen Kreis und Quadrat. Die Vererbung ist für die Funktionsweise nicht weiter erforderlich, zeigt aber, dass die Klassen durch Polymorphie über Koerper ebenfalls als Parameter- oder Rückgabewerte ausgetauscht oder in einer ArrayList etc. gespeichert werden könnten.

Die Quadratur des Kreises und ihr Gegenstück, also die Zirkulierung des Quadrates, soll hier über die Beibehaltung der Fläche erreicht werden, sodass in beiden Formen dieser Wert gleich ist. Dies führt auch dazu, dass er für die Umwandlung und die Ermittlung der benötigten Vorgabewerte für Radius und Länge verwendet werden kann.

In öffentlichen und statischen Methoden lassen sich entweder mit dem Schlüsselwort explicit die expliziten Konvertierungen der Form Kreis kreis = (Kreis)quadrat durchführen. Die impliziten Konvertierungen der Form Kreis kreis = quadrat werden dagegen durch das Schlüsselwort implicit angegeben. Grundsätzlich werden sich in diese beiden Varianten als Anweisungen keine Unterschiede ergeben. Es handelt sich nur Angaben für den Klientenquelltext und damit die konkrete Verwendung.

public class Koerper {
    public double Flaeche, Umfang;
    public Koerper(){}
}
public class Kreis : Koerper {
    public double Radius;
    public Kreis(double radius) {
        this.Radius = radius;
        this.Umfang = 2 * Math.PI * radius;
        this.Flaeche = Math.PI * Math.Pow(radius, 2);

    }
    public static implicit operator Quadrat(Kreis obj) {
        return new Quadrat(Math.Sqrt(obj.Flaeche));
    }
    public override string ToString() {
        return "R: " + Math.Round(Radius, 3) + " | F: " 
               + Math.Round(Flaeche, 3) + " | U:" 
               + Math.Round(Umfang, 3);
    }
}

public class Quadrat : Koerper {
    public double Laenge;
    public Quadrat(double laenge) {
        this.Laenge = laenge;
        this.Flaeche = Math.Pow(laenge, 2);
        this.Umfang = 4 * laenge;
    }
    public static explicit operator Kreis(Quadrat obj)  {
        return new Kreis(Math.Sqrt(obj.Flaeche/Math.PI));
    }
    public override string ToString() {
        return "L: " + Math.Round(Laenge,3) + " | F: " 
               + Math.Round(Flaeche, 3) + " | U:"
               + Math.Round(Umfang, 3);  
    }
}
Erstellung von benutzerdefinierten Konvertierungen

Man testet diese angegebenen Konvertierungen mit Hilfe von einem Kreis, der einen Radius von vier Einheiten besitzt und der in ein Quadrat umgewandelt werden soll, das den gleichen Flächeninhalt besitzt. Dies wird implizit, d.h. einfach durch Zuweisung durchgeführt, ohne den gewünschten Zieldatentyp anzugeben. Danach erstellt man ein neues Quadrat mit einer Länge von drei Einheiten, welches in einen Kreis über explizite Konvertierung umgewandelt werden soll, d.h. mit vorgestellter Zieltypangabe. Die jeweiligen Ausgaben werden zeigen, dass die Flächen tatsächlich gleich bleiben und damit auch die Umwandlungen gelingen.

Kreis k1 = new Kreis(4);
ausgabe.Text = "K1: " + k1.ToString() + "
"; // Implizite Konvertierung Quadrat q1 = k1; ausgabe.Text += "Q1: " + q1.ToString() + "
"; Quadrat q2 = new Quadrat(3); ausgabe.Text += "Q2: " + q2.ToString() + "
"; // Explizite Konvertierung Kreis k2 = (Kreis)q2; ausgabe.Text += "K2: " + k2.ToString();
Einsatz von benutzerdefinierten Konvertierungen

Man erhält als Ergebnis die in der ToString-Methode zusammengefassten Informationen, wobei insbesondere die gefetteten Flächeninhalte bedeutsam sind, da sie zeigen, dass die Umwandlung mit Hilfe dieser Angaben funktioniert hat.

K1: R: 4 | F: 50,265 | U:25,133
Q1: L: 7,09 | F: 50,265 | U:28,359
Q2: L: 3 | F: 9 | U:12
K2: R: 1,693 | F: 9 | U:10,635
Das UML-Diagramm fasst das Beispiel noch einmal zusammen und zeigt auch überblicksartig, wie die beiden statischen Methoden jeweils die andere Kindklasse von Koerper als Rückgabewert besitzen.

UML-Diagramm der Kreisquadratur

UML-Diagramm der Kreisquadratur

Um den gegenseitigen Aufruf noch einmal zu veranschaulichen, bietet die nachfolgende Grafik die wichtigen Inhalte der beiden Klassen noch einmal direkt nebeneinander. Die Pfeile verbinden die Konvertierungsmethoden mit den jeweiligen Konstruktoren, die sie über die Objekterzeugung aufrufen.

Konvertierungen

Konvertierungen

    Comelio GmbH C#.NET - Datentypkonvertierungen Syntax Entwurfsmuster .NET Tutorial Code Beispiel C#.NET Microsoft Programmierung Anleitung -Comelio GmbH C#.NET - Datentypkonvertierungen Syntax Entwurfsmuster .NET Tutorial Code Beispiel C#.NET Microsoft Programmierung Anleitung -Comelio GmbH C#.NET - Datentypkonvertierungen Syntax Entwurfsmuster .NET Tutorial Code Beispiel C#.NET Microsoft Programmierung Anleitung -Comelio GmbH C#.NET - Datentypkonvertierungen Syntax Entwurfsmuster .NET Tutorial Code Beispiel C#.NET Microsoft Programmierung Anleitung -Comelio GmbH C#.NET - Datentypkonvertierungen Syntax Entwurfsmuster .NET Tutorial Code Beispiel C#.NET Microsoft Programmierung Anleitung -Comelio GmbH C#.NET - Datentypkonvertierungen Syntax Entwurfsmuster .NET Tutorial Code Beispiel C#.NET Microsoft Programmierung Anleitung -Comelio GmbH C#.NET - Datentypkonvertierungen Syntax Entwurfsmuster .NET Tutorial Code Beispiel C#.NET Microsoft Programmierung Anleitung -Comelio GmbH C#.NET - Datentypkonvertierungen Syntax Entwurfsmuster .NET Tutorial Code Beispiel C#.NET Microsoft Programmierung Anleitung -Comelio GmbH C#.NET - Datentypkonvertierungen Syntax Entwurfsmuster .NET Tutorial Code Beispiel C#.NET Microsoft Programmierung Anleitung -