Start
Unternehmen
Buch-Katalog
Seminare
Leserservice
Comelio-Blog
Datenbanken
SQL
MS SQL Server
Oracle
PHP
UML
C#.NET

Operator-Überladung

Konvertierungen

Schnittstellen

Abstrakte Klassen

Delegation

Indexer

Code-Behind

Adapter-Muster

Dekorierer-Muster

Kompositum-Muster

XML Schema
XSLT

Übersicht

Comelio GmbH
Rellinghauser Straße 10
D-45128 Essen
Deutschland
Fon: 0201-437517-0
Fax: 0201-437517-10
info@comelio.com

Comelio GmbH
Goethestraße 34
D-13086 Berlin
Deutschland
Fon: 030-921019-85
Fax: 030-921019-89
info@comelio.com

Comelio GmbH (Ecos)
Glockengießerwall 17
D-20095 Hamburg
Deutschland
Fon: 040-4689908-91
Fax: 040-4689908-95
info@comelio.com

Comelio GmbH (Ecos)
Mainzer Landstraße 27-31
D-60329 Frankfurt
Deutschland
Fon: 069-2475030-35
Fax: 069-2475030-39
info@comelio.com

Comelio GmbH (Ecos)
Stiglmaierplatz/Dachauer Str. 37
D-80335 München
Deutschland
Fon: 089-2000154-90
Fax: 089-2000154-94
info@comelio.com

Comelio GmbH (Ecos)
Liebknechtstr. 33
D-70565 Stuttgart
Deutschland
Fon: 0711-252534-20
Fax: 0711-252534-24
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 Comelio GmbH C#.NET - Datentypkonvertierungen Comelio GmbH C#.NET - Datentypkonvertierungen Comelio GmbH C#.NET - Datentypkonvertierungen Comelio GmbH C#.NET - Datentypkonvertierungen Comelio GmbH C#.NET - Datentypkonvertierungen Comelio GmbH C#.NET - Datentypkonvertierungen Comelio GmbH C#.NET - Datentypkonvertierungen Comelio GmbH C#.NET - Datentypkonvertierungen