Operator overloading in C#

Trefwoorden: C#, operator, overloading
1. Probleem
In C# heb je zoals in alle programmeertalen "operators", de bekendste zijn natuurlijk de +,-,*,%,....... enzovoorts
doorgaands worden hiermee actie's uitgevoerd op "waarde" typen zoals integers, floats, enzovoorts .......

Maar aangezien C# Object GŽorienteerd is komen we voor een probleempje te staan : wat als we nu objecten willen 'optellen' of 'aftrekken' of bijvoorbeeld willen rekenen met 'structs'.........

Aangezien bij objecten van een klasse de gewone vergelijking invloed heeft op het geheugenadres en niet de inhoud komen we voor een probleempje te staan.
Mogelijke oplossing is natuurlijk om voor die klasse methode's te schrijven in de vorm van .Add() of .Subtract() of ...... nu dit gaat perfect maar is minder leesbaar dan :
object1 = object2 + object3

Wat we dus nodig hebben is een uitbreiding op de operators.

2. Oplossing
Het .Net framework geeft ons hiervoor een krachtige basis, we nemen een voorbeeldje in C# :

Stel een klant heeft een nummer, een naam en een totaal bedrag van aankopen :
CODE
  1.  
  2. class Klant
  3. {
  4.     private string naam ;
  5.     private int nummer ;
  6.     private double bedrag ;
  7.     // de constructor :
  8.     public Klant(string _naam, int _nummer, double _bedrag)
  9.    {
  10.          this.naam = _naam ;
  11.          this.nummer = _nummer ;
  12.          this.bedrag = _bedrag ;
  13.    }
  14. }     
  15.  

Nu als we een klant willen vergelijken met een andere klant is eigenlijk enkel het 'nummer' belangrijk om te vergelijken....
Op de klassieke manier schrijven we daarom een methode bij die teruggeeft of beide nummers gelijk zijn :
CODE
  1.  
  2. public bool IsGelijk(Klant _klant)
  3. {
  4.     return _klant.nummer = this.nummer ;
  5. }
  6.  

als we nu 2 klantobjecten willen vergelijken doe we dit op deze manier :
CODE
  1.  
  2. if(klant1.IsGelijk(klant2))
  3. {
  4.     // hier de statements
  5. }
  6.  

nu dit is allemaal mooi en wel maar komt de leesbaarheid niet ten goede, zou het niet leuker zijn als we gewoon konden schrijven :
CODE
  1.  
  2. if(klant1 == klant2)
  3. {
  4.     // hier de statements
  5. }
  6.  

nu dat is mogelijk en wel op deze manier :
CODE
  1.  
  2. public static bool operator ==(Klant _k1, Klant _k2)
  3. {
  4.         return (_k1.nummer == _k2.nummer) ;
  5. }
  6.  

Let wel op : als je de == overload moet je ook de != overloaden
natuurlijk is dit maar een klein werkje want je kan dan al gebruik maken van de == :
CODE
  1.  
  2. public static bool operator !=(Klant _k1, Klant _k2)
  3. {
  4.         return !(_k1== _k2) ;
  5. }
  6.  

Indien we nu zouden willen dat klant1 + klant2 het totaalbedrag zou optellen van de klanten dan kunnen we ook de + operator uitbreiden :
CODE
  1.  
  2. public static Klant operator + (Klant _k1, Klant _k2)
  3. {
  4.         return new Klant(_k1.naam,_k1.nummer,_k1.bedrag + _k2.bedrag);
  5. }
  6.  


In het bovenstaande voorbeeldje worden klassen gebruikt maar hetzelfde gaat natuurlijk ook voor Structs, deze zullen meer dan waarschijnlijk meer voorkomen aangezien deze waarden types zijn ..........

ps : nog niet in mene visual studio kunnen gooien dus khoop da alle syntax just is :)Dit artikel werd geschreven door Bridge_Burner op maandag 31 mei 2004 om 19:02 en werd sindsdien 5417 keer gelezen.

  • Pagina
  • 1 van 1

Bericht geplaatst door een gast op donderdag 19 januari 2006 om 18:13:02.
ik heb net gehoord dat een struct geen methodes bevat... of is mijn bron verkeerd. Hoe dan ook, ALS een struct geen methodes bevat, kan je er ook geen operator overload in definiŽren...
Bericht geplaatst door een gast op vrijdag 2 februari 2007 om 11:00:05.
je bron is verkeerd ;)
Bericht geplaatst door NightCreature op dinsdag 13 maart 2007 om 01:13:01.
NightCreature's avatar
Multiviteit: 1196
MSc.
Net als in C en C++ kan je in C# gewoon een methode definieren in een struct. Echter behandelt C# een struct niet als een public class zoals C/C++ dat wel doet en moet je bij de functie die je erin definieert een acces methode meegeven (private, protected of public), C++ gaat er gewoon vanuit dat je een compleet public class aan het definieren bent.
I need thought completion.
Shaders, een beetje vreemd maar wel lekker (voor de ogen dan he)
2.83Ghz Q9550 HD4850 512MiB 4GiB 1333Mhz DDR3 RAM
http://paulintheuk.blogspot.com
FE Programmer @ Codemasters (Front End)
  • Pagina
  • 1 van 1