Overerving in C#
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.
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) { }
}
}
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...
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…