Object Oriëntatie in C#

  1. Inleiding
  2. Enumeratie
  3. Klasse
  4. Eigenschappen
  5. Methode
  6. Object
  7. Statische klasse
  8. Slot
  9. Voorbeeldprogramma

Inleiding

C# is een object georiënteerde programmeertaal waarin je allerlei klassen kunt definiëren. Vanuit de klassen creëer je objecten en het zijn uiteindelijk de objecten die een steentje gaan bijdragen aan jouw programma. C# kent out-of-the-box heel veel voorgedefinieerde klassen en objecten en we gebruiken in C# (onbewust) al heel veel van die klassen en objecten.

We zullen het één en ander toelichten aan de hand van een voorbeeld. Het voorbeeld betreft een auto met bijbehorende autofabrikanten waarbij de autofabrikanten elkaar fel beconcurreren en creatieve, object georiënteerde oplossingen verzinnen om hun auto’s zo milieuvriendelijk te laten doen ogen.

up | down

Enumeratie

Casus voor onze voorbeelden is een milieumaatregel in Frankrijk. Franse gemeentes kunnen sinds 2016 voor hun gebieden tijdelijke en permanente milieuzones instellen. Het is dan de bedoeling dat de milieuzones tijdelijk of permanent niet toegankelijk zijn voor voertuigen met een te hoge uitstoot aan stikstofoxiden en fijnstof. Men hoopt dat met deze maatregel de luchtkwaliteit in de desbetreffende gebieden verbetert / niet verder achteruit gaat.

Voor het betreden van zo’n milieuzone is een milieusticker nodig zodat handhavers aan de hand van die milieusticker snel kunnen zien of de desbetreffende voertuig zich wel in die milieuzone mag bevinden. Voertuigbezitters moeten een milieusticker aanvragen en men krijgt dan een milieusticker met een bepaalde kleur waarbij de kleur uiteindelijk wordt bepaald door de lijsten die bij het Franse ministerie in omloop zijn. De Franse milieusticker kent zes kleuren en de kleuren staan voor het volgende:

  1. Groen staat voor de milieuvriendelijkste voertuigen.
  2. Paars staat voor de iets minder schone voertuigen.
  3. Geel staat voor de iets oudere voertuigen die wat meer fijnstof uitstoten dan de paarse voertuigen.
  4. Oranje staat voor de relatief vervuilende voertuigen, meer vervuilend dan de gele voertuigen en qua leeftijd ook wat ouder dan de gele voertuigen.
  5. Rood staat voor de voertuigen die meer vervuilen dan de oranje voertuigen en ook motorfietsen en bromfietsen vallen onder deze categorie.
  6. Grijs staat voor de meest vervuilende voertuigen (meestal de oudere voertuigen met een dieselmotor).

We gebruiken in de onderstaande voorbeelden voor de kleur van de milieusticker een nummer en met de C# enum kunnen we kleurnamen gebruiken in plaats van kleurnummers.

public enum Kleur
{
  //0. de milieuvriendelijkste voertuigen
  Groen,  
  
  //1. iets minder schoon
  Paars,  
  
  //2. iets ouder en iets minder schoon
  Geel,   
  
  //3. nog ouder en relatief vervuilend
  Oranje, 
  
  //4. die goede oude tijd toen je nog 
  //zonder gene diesel kon uitkotsen
  Rood,
     
  //5. ultra vervuilend, je hebt een 
  //Boeing B-47 Stratojet met 
  //afterburners en nucleaire lading
  Grijs   

}

up | down

Klasse

Er is dus “iets” wat de aandacht gaat krijgen van ons programma en de object oriëntatie / OOP (Object Oriented Programming) begint met het definiëren van een klasse voor datgene wat onze aandacht gaat krijgen. In deze post krijgt de auto onze welgemeende aandacht en we gaan dan ook een klasse voor die auto definiëren met de naam “Auto”.

We kunnen van een auto heel veel dingen vastleggen, maar we zijn in dit voorbeeld alleen maar geïnteresseerd in:
– het merk
– de kleur milieusticker die de auto mag hebben
– de vervuilingsgraad (een opmerking hoe milieubelastend het voertuig is)

Alle andere eigenschappen (kleur, gewicht, motorvermogen etc.) laten we buiten beschouwing. In C# krijgen we dan een klasse definitie met de aspecten die voor ons van belang zijn.

up | down

Eigenschappen / Properties

De klasse heeft in ons geval drie properties (Merk, Milieusticker en Vervuilingsgraad) en de properties zijn te herkennen aan een set en een get.

Voor het vullen en het opvragen van de waarden van de properties wordt gebruik gemaakt van backing variables (ook wel fields genoemd). Backing variables zijn bedoeld als interne variabelen die alleen binnen de klasse gebruikt worden.

Backing variables hebben het voordeel dat via de backing variabele eventueel nog een additionele bewerking gedaan kan worden op de waarde voor de property. De bewerkte waarde wordt dan uiteindelijk opgeslagen in de property en/of getoond aan de “buitenwereld”.

Een naamgevingsconventie is dat de naam van een backing variables met een ” _” (underscore) begint. In onderstaand voorbeeld volgen we die naamgevingsconventie.

class Auto

{

   // -- Backing variables - fields --
   private string _merk;
   
private int _milieusticker;
   
private string _vervuilingsgraad;
   
   // Constructor

   public Auto(string merk, int milieusticker)
   
{
  
     _milieusticker = milieusticker;
  
     _merk = merk;
  
     _vervuilingsgraad = OverJeAuto(milieusticker);
   
}



   // Property Merk

   public string Merk
   
{
 
     get { return _merk; }
 
     set { _merk = value; }
   
}
   
   

// Property MilieuSticker
   
public int MilieuSticker
   
{

     get { return _milieusticker; }
 
     set { _milieusticker = value; }
   
}
   
   

// Property Vervuilingsgraad

   public string Vervuilingsgraad
   
{
  
     get { return _vervuilingsgraad; }
   
}

   
   // Methode OverjeAuto
   public virtual string OverJeAuto(int kleur)
   { . . . }

}

up | down

Methode

We hebben methode OverjeAuto() gedefinieerd in de Auto klasse. We gebruiken methode OverjeAuto() om aan de hand van een kleurnummer property Vervuilingsgraad te vullen. In methode OverjeAuto() gebruiken we de eerder gedefinieerde enum en we kunnen dankzij de enum een link leggen met een specifieke kleur waardoor het idee achter de code ook beter tot uiting komt.

// Methode OverjeAuto
public string OverJeAuto(int kleur)
{
  string resultaat = "";

  switch (kleur)
  {

    case (int)Kleur.Groen:
         resultaat = 
         "Je voertuig is momenteel 
         de milieuvriendelijkste.";
         break;
  
    case (int)Kleur.Paars:
  
         resultaat = 
         "Je voertuig zit iets onder 
         de norm, maar voldoet.";
  
         break;
  
    case (int)Kleur.Geel:
  
         resultaat = 
         "Je voertuig is al wat ouder en 
         iets minder schoon.";
  
         break;
  
    case (int)Kleur.Oranje:
  
         resultaat = 
         "Je voertuig is tamelijk oud en 
         relatief vervuilend.";

         break;

    case (int)Kleur.Rood:
  
         resultaat = 
         "Je voertuig zeer vervuilend!" + 
         Environment.NewLine +
 
         "Je voertuig is uit die 
         goede oude tijd dat 
         je nog zonder gene diesel 
         kon uitbraken.";
  
         break;
  
    case (int)Kleur.Grijs:
         
resultaat = 
         "Je voertuig is ultra vervuilend!!" + 
         Environment.NewLine +
  
         "Heb je soms een B-47 Stratojet met 
         afterburners en nucleaire lading?";
  
         break;
  
    default:
  
         resultaat = 
         "Geen gegevens bekend over 
         de vervuilingsgraad.";
  
         break;
  
}
  return resultaat;
}

up | down

Object

We hebben een klasse gedefinieerd, maar de klasse is alleen nog maar een blauwdruk. Het programma heeft nog geen concreet iets. Vanuit de klasse gaan we objecten creëren (instantiëren) en het programma zal uiteindelijk met die objecten aan de gang gaan.

We creëren als object een echte “GHB GuanggongHunnenburgBetrieb” auto. een veelbelovend nieuw product dat geboren is uit een nieuw internationaal samenwerkingsverband:

class MainClass
{
  public static void Main(string[] args)
  {
    // Vul object - instantieer met 2 parameters
    Auto mijnAuto = new Auto(
    merk: "GHB (GuanggongHunnenburgBetrieb)",
    milieusticker: (int)Kleur.Grijs);

    // En we hebben..
    Console.WriteLine(
    "Je bent in het trotse bezit van:");
    Console.WriteLine(
    "- een {0}.", mijnAuto.Merk);

    Console.WriteLine(
    "- En de Milieusticker van je bolide is {0}." +
    Environment.NewLine,
    (Kleur)mijnAuto.MilieuSticker);

    Console.WriteLine(
    "Over de vervuilingsgraad van je auto:" +
    Environment.NewLine +
    "{0}" + Environment.NewLine,
    mijnAuto.Vervuilingsgraad);
  }
}

Het object is gecreëerd met concrete waarden waarbij we beschikken over datgene wat we eerder in de klasse hadden gedefinieerd. We zien van het object o.a. de waarde van eigenschap Vervuilingsgraad, een eigenschap waarvan de waarde is gevuld door methode OverjeAuto():

Je bent in het trotse bezit van:
- een GHB (GuanggongHunnenburgBetrieb).
- En de Milieusticker van je bolide is Grijs.

Over de vervuilingsgraad van je auto:
- Je voertuig is ultra vervuilend!!
  Heb je soms een B-47 Stratojet met 
  afterburners en nucleaire lading?

Press any key to continue...

Onze GHB GuanggongHunnenburgBetrieb auto doet het niet zo goed voor wat betreft de vervuilingsgraad (of anders gezegd, hij vervuilt prima, maar dat schijnt iets te zijn wat niet iedereen waardeert). Frankrijk heeft inmiddels haar milieuzones en het ziet ernaar uit dat veel van die zones voor onze GuanggongHunnenburgBetrieb niet toegankelijk zullen zijn tenzij we sjoemelen met / iets aan de vervuilingsgraad doen.

up | down

Statische klasse

In het voorbeeld hierboven hebben we een Auto klasse gedefinieerd. We instantiëren vanuit die klasse een object en we hebben in het voorbeeld vanuit de klasse een mijnAuto object geïnstantieerd, zijnde een echte ultra vervuilende GHB GuanggongHunnenburgBetrieb auto met een grijze milieusticker.

Er zijn echter ook klassen die zonder object instantiatie meteen gebruikt kunnen worden. Een voorbeeld is de Console.WriteLine()-commando waarmee iets op het scherm wordt getoond. De WriteLine()-methode is onderdeel van de Console-klasse en de Console-klasse is een statische klasse hetgeen we zien bij onderstaande klasse definitie. De statische klasse is te herkennen aan de static key word.

Er valt wel wat te zeggen voor het statisch wezen van de Console klasse. We gebruiken de Console klasse uitsluitend voor de methodes die in de Console klasse aanwezig zijn. Een noodzaak voor unieke uit die klasse geïnstantieerde objecten is er verder niet.

Statische klassen zijn verder uitstekend geschikt voor het doen huisvesten van formules. Zo definieer je een statische klasse en in die statische klasse definieer je een methode welke een formule bevat. Je roept dan elke keer de desbetreffende methode aan als je iets met de formule berekend wilt hebben. Je verlangt een bepaalde uitkomst en meer wil je eigenlijk niet waardoor de noodzaak voor instantiëren e.d. niet nodig is. Bijvoorbeeld…

// een eenvoudige formule:
// afstand = snelheid * tijd 
int snelheid = ...;
int tijd = ...;
int afstand = statischeKlasse.formule(snelheid, tijd);

up | down

Slot

C# is een object georiënteerde programmeertaal waarin je allerlei klassen kunt definiëren. Vanuit de klassen creëer je objecten en het zijn uiteindelijk de objecten die een steentje gaan bijdragen aan jouw programma. C# kent out-of-the-box heel veel voorgedefinieerde klassen en objecten en we gebruiken in C# (onbewust) al heel veel van die klassen en objecten.

Een voorbeeld is de Console.WriteLIne()-commando om gegevens te laten afdrukken op het scherm. De Console-klasse is een statische klasse dat out-of-the-box bij C# zit. Een ander voorbeeld is de StringBuilder. De StringBuilder kwam in deze post ter sprake en we zien in onderstaande code snippet dat de StringBuilder ook maar een klasse met bijbehorende methodes is:

// instantieer een object
StringBuilder stringBuilder = new StringBuilder();

foreach (string tekst in enumerabele) 
{
  // we gebruiken methode .AppendLine()
  // uit het object (die het weer 
  // uit de klasse definitie heeft)
  stringBuilder.AppendLine(tekst);
}

We hebben in deze post ook laten zien hoe je je eigen klassen en objecten maakt en in het voorbeeld hebben we een object het levenslicht laten zien, te weten een echte “GHB GuanggongHunnenburgBetrieb”-auto. Een veelbelovend ultra vervuilend voertuig dat het resultaat is van een nieuw internationaal samenwerkingsverband. Het programma zal uiteindelijk met de objecten aan de gang gaan.

In de volgende posts zullen diverse object georiënteerde technieken aan de orde komen en zal ik laten zien wat nog meer mogelijk is m.b.t. klassen en objecten.

Hopelijk ben je met deze posting weer wat wijzer geworden en ik hoop je weer terug te zien in één van mijn volgende blog posts. Wil je weten wat ik nog meer over C# heb geschreven? Hit the C# button…

up | down

Voorbeeldprogramma


using System;

public enum Kleur
{
    Groen,
    Paars,
    Geel,
    Oranje, 
    Rood,
    Grijs
}

class Auto
{
  // Backing variables - fields
  private string _merk;
  private int _milieusticker;
  private string _vervuilingsgraad;
  
  // Property Merk
  public string Merk
  {
   get { return _merk; }
   set { _merk = value; }
  }
  
  // Property MilieuSticker
  public int MilieuSticker
  {
   get { return _milieusticker; }
   set { _milieusticker = value; }
  }
  
  // Property Vervuilingsgraad
  public string Vervuilingsgraad
  {
    get { return _vervuilingsgraad; }
  }

  // Constructor
  public Auto(string merk, int milieusticker)
  {
    _milieusticker = milieusticker;
    _merk = merk;
    _vervuilingsgraad = OverJeAuto(milieusticker);
  }
 
  // Methode OverjeAuto
  public string OverJeAuto(int kleur)
  {
    string resultaat = "";
    switch (kleur)
    {
      case (int)Kleur.Groen:
           resultaat = 
           "- Je voertuig is momenteel 
              de milieuvriendelijkste.";
           break;
      case (int)Kleur.Paars:
          resultaat = 
          "- Je voertuig zit iets onder de norm, 
             maar voldoet.";
          break;
      case (int)Kleur.Geel:
          resultaat = 
          "- Je voertuig is al wat ouder en 
             iets minder schoon.";
          break;
      case (int)Kleur.Oranje:
          resultaat = 
          "- Je voertuig is tamelijk oud en 
             relatief vervuilend.";
          break;
      case (int)Kleur.Rood:
          resultaat = 
          "- Je voertuig zeer vervuilend!
             Je voertuig is uit die 
             goede oude tijd dat 
             je nog zonder gene diesel 
             kon uitbraken.";
          break;
      case (int)Kleur.Grijs:
          resultaat = 
          "- Je voertuig is ultra vervuilend!!
             Heb je soms een B-47 Stratojet met 
             afterburners en nucleaire lading?";
          break;
      default:
          resultaat = 
          "- Geen gegevens bekend over 
             de vervuilingsgraad.";
          break;
    }
    return resultaat;
  }
}

class MainClass
{
 public static void Main(string[] args)
 {
  // Instantieer
  Auto mijnAuto = new Auto(
  merk: "GHB (GuanggongHunnenburgBetrieb)",
  milieusticker: (int)Kleur.Grijs);
  
  // En we hebben..
  Console.WriteLine(
  "Je bent in het trotse bezit van:");
  Console.WriteLine(
  "- een {0}.", mijnAuto.Merk);
  
  Console.WriteLine(
  "- En de Milieusticker van je bolide is {0}." +
  Environment.NewLine,
  (Kleur)mijnAuto.MilieuSticker);
  
  Console.WriteLine(
  "Over de vervuilingsgraad van je auto:" +
  Environment.NewLine +
  "{0}" + Environment.NewLine,
  mijnAuto.Vervuilingsgraad);  
 }
}

up

Laat een reactie achter

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *