Overerving in C#

  1. Inleiding
  2. Class Library
  3. Overerving
  4. Slot

Inleiding

Eén van de concepten binnen OOP (Object geOriënteerd Programmeren) is overerving (ook wel incapsulation genoemd). De bedoeling van overerving is dat zo min mogelijk code gedupliceerd wordt en dat bereik je door hergebruik van de functionaliteit van bovenliggende klassen (de parent classes). Op die manier “erf” je de zaken van een parent zodat je die functionaliteit niet nogmaals in de child class hoeft op te nemen.

up | down

Class Library

We hadden het in een eerdere post al gehad over assemblies en een dynamic link library assembly (.dll) is bedoeld als een bibliotheek dat door meerdere programma’s gebruikt kan worden.

Terugkomend op het eerdere voorbeeld in de post over Object Oriëntatie in C# besluit auto fabrikant GHB GuanggongHunnenburgBetrieb een Class Library te maken dat gebruikt kan worden door de vele productieafdelingen binnen het GHB conglomeraat.

Zo gezegd zo gedaan, de class Library wordt gemaakt en het eindresultaat is een .dll bestand (GHB-classLibrary.dll).

using System;
namespace GHBclassLibrary
{
  public class GHB
  {
   enum Kleur
   {
    Groen,
    Paars,
    Geel,
    Oranje,
    Rood,
    Grijs
   }
   
   // Methode OverjeAuto
   public virtual 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!";
       break;
       case (int)Kleur.Grijs:
       resultaat =
       "- Je voertuig is ultra vervuilend!!";
       break;
       default:
       resultaat =
       "- Geen gegevens bekend over 
          de vervuilingsgraad.";
       break;
     }
     return resultaat;
   }
 
   // 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 - 
    // als 2 parameters zijn opgegeven
    public GHB(string merk, int milieusticker)
    {
      _milieusticker = milieusticker;
      _merk = merk;
      _vervuilingsgraad = OverJeAuto(milieusticker);
    }
   
    // Constructor - 
   //  Als 1 parameter is opgegeven
    public GHB(string merk) 
    : this(merk, (int)Kleur.Groen) { }
    
    // Constructour - 
    /  Als geen parameters zijn opgegeven
    public GHB() 
    : this("GHB (GuanggongHunnenburgBetrieb)", 
    (int)Kleur.Groen) { }
  }
}

up | down

Overerving

We gaan verder met ons voorbeeld en autofabrikant MGIM (Migraine Imperialist Motors Corporation Groupe) is marktleider, concurrent en aartsvijand van autofabrikant GHB (GuanggongHunnenburgBetrieb). MGIM ziet met lede ogen aan hoe GHB steeds meer marktaandeel weet te veroveren en het besluit dan ook om een nieuw product te lanceren waarmee de opmars van GHB gestuit kan worden.

Beter goed gejat dan slecht verzonnen en MGIM weet via slinkse wegen haar handen te leggen op de GHB Class library (GHB-classLibrary.dll). MGIM past vervolgens de overerving object oriëntatie concepten als volgt toe:

  • een verwijzing maken naar de GHBclassLibrary
    using GHBclassLibrary;
  • een eigen klasse MGIB maken dat alles erft van klasse GHB
    class MGIM : GHB
  • de constructor van de eigen klasse aanpassen om gênante meldingen dat zaken toch nog van GHB afkomstig zijn te verhullen, let op de base key word waarmee alles wordt doorgelinkt naar de constructors van de base class (in dit voorbeeld de GHBclassLibary)
using System;

// Verwijzing naar de GHBclassLibary
using GHBclassLibrary;

enum kleurSticker
{
  Green,
  Purple,
  Yellow,
  Orange,
  Red,
  Grey
}
 
// Een eigen klasse maken
// Alles erven uit
// jatten van klasse GHB
class MGIM : GHB
{
    // Constructor 
    // Als geen parameters zijn opgegeven
    // het moet natuurlijk wel een MGIM zijn
    public MGIM() 
    : base("MGIM Migraine Imperialist 
            Motors Corporation Groupe", 
           (int)kleurSticker.Green) { }

    // Constructor
    // Als 1 parameter is opgegeven
    public MGIM(string merk) 
    : base(merk, (int)kleurSticker.Green) { }

    // Constructor
    // Als 2 parameters zijn opgegeven
    public MGIM(string merk, int milieusticker) 
    : base(merk, milieusticker) { }
}

class MainClass
{
  public static void Main(string[] args)
  {
   // Instantieer
   MGIM mijnMGIM = new MGIM();

   // En we hebben..
   Console.WriteLine(
   "You are the proud owner of:");
   Console.WriteLine(
   "- a {0}.", mijnMGIM.Merk);

   Console.WriteLine(
   "- And the environmental 
      color sticker of your car is {0}." +
   Environment.NewLine,
   (kleurSticker)mijnMGIM.MilieuSticker);
   
   Console.WriteLine("About the pollution 
                      of your car:" +
   Environment.NewLine +
   "{0}" + Environment.NewLine,
   mijnMGIM.Vervuilingsgraad);
  }
}

En MGIM heeft dankzij de object oriëntatie overerving concepten (en het betere jatwerk) een echte MGIM Migraine Imperialist Motors Corporation Groupe-auto dat een eind zal maken aan de opmars van de GHB (GuanggongHunnenburgBetrieb)-auto.

You are the proud owner of:
- a MGIM Migraine Imperialist 
  Motors Corporation Groupe.
- And the environmental color sticker 
  of your car is Green.

About the pollution of your car:
- Je voertuig is momenteel 
  de milieuvriendelijkste.

Press any key to continue...


up | down

Slot

We hebben in deze post laten zien hoe we gebruik kunnen maken van een bestaande klasse en hoe we alles van die klasse (de parent class) kunnen gebruiken. Op die manier “erf” je de zaken van een parent zodat je die functionaliteit niet nogmaals in de child class hoeft te maken (in ons voorbeeld is de child een aartsconcurrent van de parent en de parent zal daar ongetwijfeld niet zo blij mee zijn).

De functionaliteit van de parent klasse hoeft niet altijd een in beton gegoten waarheid te zijn en we kunnen onze eigen functionaliteiten inbouwen indien we willen afwijken van de functionaliteiten van de parent class. Als parent hoef je ook niet alles over je kant te laten gaan en je kunt als parent ervoor zorgen dat niet aan je functionaliteit wordt gemorreld en je kunt zelfs delen van je klasse afschermen voor buitenstaanders. Meer erover in de volgende posts.

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

Laat een reactie achter

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