tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
370
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Exceptionfault
    Exceptionfault Exceptionfault ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Ort
    Neckarsulm
    Beiträge
    348
    Ein sehr schönes Feature, das komischerweise viel zu selten genutzt wird, ist die Operanden Überladung in .NET. In C war das eine ziemlich schräge Sache und so haben wohl viele noch die mahnenden Worte vieler C Entwickler im Ohr: "Tut das niemals wenn ihr Chaos vermeiden wollt"

    Unter .NET ist es aber eine sehr praktische Sache, kleines Beispiel:
    Wie haben eine Klasse Konto
    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
    
        class Konto
        {
            private decimal _geld;
            private String _besitzer;
     
            public Konto(String Besitzer)
            {
                this._geld = 0;
                this._besitzer = Besitzer;
            }
     
            public decimal Geld
            {
                get { return this._geld; }
            }
     
            public String Besitzer
            {
                get { return this._besitzer; }
            }
     
            public void BucheBetrag(decimal betrag)
            {
                this._geld += betrag;
            }
    }

    Im Normalfall würden wir, um den Betrag eines Kontos zu ändern die Methode "BucheBetrag" aufrufen. /* Sehen wir mal über irgendwelche Validierungen hinweg! */ Im Code würde das dann vielleicht so aussehen:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
        class Program
        {
            static void Main(string[] args)
            {
                Konto k1 = new Konto("Exceptionfault");
                Konto k2 = new Konto("Anonymous");
     
                Console.WriteLine("Betrag : " + k1.Geld.ToString());
                Console.WriteLine("Betrag : " + k2.Geld.ToString());
                Console.WriteLine("=============================="); 
                
                k1.BucheBetrag(100);
                k2.BucheBetrag(1000);
                Console.WriteLine("Betrag : " + k1.Geld.ToString());
                Console.WriteLine("Betrag : " + k2.Geld.ToString());
                Console.WriteLine("==============================");
            }
        }
    Ist sicher nicht falsch, und auch sehr leserlich, aber für interne Funktionen etc. ist mir das zu viel Code. Wie wärs denn damit ?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
                k1 += 100;
                Console.WriteLine("Betrag : " + k1.Geld.ToString());
                Console.WriteLine("Betrag : " + k2.Geld.ToString());
                Console.WriteLine("==============================");
     
                k1 = k1 + k2;
                Console.WriteLine("Betrag : " + k1.Geld.ToString());
                Console.WriteLine("Betrag : " + k2.Geld.ToString());
    Was erwarten wir hier? Klar, der Betrag von k1 wird um 100 erhöht, danach wird der Betrag von k2 auf k1 addiert.
    Um ganze Objekte addieren zu können habe ich in der Klasse Konto den "+" Operator überladen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
            public static Konto operator +(Konto k, decimal betrag)
            {
                k._geld += betrag;
                return k;
            }
     
            public static Konto operator +(Konto k1, Konto k2)
            {
                k1._geld += k2._geld;
                k2._geld = 0;
                return k1;
            }
    Ist nicht viel Aufwand, und der Code wird kurz und intuitiv (wenn mans nicht übertreibt ! )
     
    liebe Grüße
    Exceptionfault (http://exceptionfault.de)

    Never say: "Always"! Always say: "Never say never"! - Tom Kyte @ Ask Tom Live in Berlin 2008

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Nur so zur Info: Man kann Operatoren überladen - keine Operanden.

    In C kann man gar nichts überladen - keine Funktionen und auch keine Operatoren; Operanden schon überhaupt nicht. Du meintest vermutlich die Programmiersprache C++ wo das allerdings gang und gäbe ist Operatoren zu überladen.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    Nur so zur Info: Man kann Operatoren überladen - keine Operanden.
    Exceptionfault hat sicherlich Operatoren gemeint

    Also meiner Meinung nach sollte man dieses "Feature" (außer in Mathematischen Bibliotheken oder bei der String-Verkettung) wirklich bleiben lassen. Auch bei deinem Konto Fall ist IMHO kein gutes Beispiel, denn die Semantik des + Operators ist in diesem Fall unklar. Man addiert ja keinen Betrag auf ein Konto (Account) sondern einen Kontostand (Balance) also der Wert den dieses Konto manifestiert. In diesem Fall führt die Verwendung dieses Operators zu Verwirrung.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

Ähnliche Themen

  1. Trennen von Operanden und Operatoren mittels Reguläre Ausdrücke
    Von stahlschrank im Forum Sonstige Sprachen
    Antworten: 0
    Letzter Beitrag: 17.07.06, 10:40
  2. Frage zu Operanden
    Von qsrs im Forum PHP
    Antworten: 3
    Letzter Beitrag: 30.01.05, 23:49
  3. Operanden-Problem (Variable)
    Von Zeitgeist im Forum Flash Plattform
    Antworten: 4
    Letzter Beitrag: 19.03.04, 12:31