Meerdere interfaces in C#

  1. Inleiding
  2. Interfaces
  3. Klasse
  4. Object
  5. Slot
  6. Voorbeeldprogramma

Inleiding

De interface was reeds ter sprake gekomen in een eerdere post over Abstracte klassen en Interfaces. Een interface kan de basis vormen voor een klasse en een interface is een kaal raamwerk waarvan diens onderdelen verplicht geïmplementeerd moeten worden door de klasse die de interface gaat gebruiken.

Een klasse kan in C# gevormd worden door meerdere interfaces. Dit in tegenstelling tot de (abstracte) klasse want een klasse kan in C# maar van één (abstracte) klasse erven. In andere programmeertalen zoals C++ kan wel van meerdere klassen geërfd worden, maar in C# dus niet of nog niet.

Deze post gaat verder met het voorbeeld dat in de post over Abstracte klassen en Interfaces is besproken. Het verdient de aanbeveling eerst de desbetreffende post te lezen alvorens verder te gaan met deze post.

In deze post bekijken we hoe een klasse meerdere interfaces kan gebruiken. We lichten het toe aan de hand van fictieve autofabrikant MGIM.

up | down

Interfaces

MGIM (Migraine Imperialist Motors Corporation Groupe) is in haar streven naar werelddominantie wereldwijd actief en waar men actief is, dat kan variëren van Europa tot Oceanië. Elk afzetgebied heeft weer haar eigen karakteristieken wat o.a. het aantal maanden garantie bepaalt dan men wil geven op een auto.

In Oceanië zijn de weersomstandigheden meestal wat beter dan in Europa en de auto’s zullen, gezien het oppervlak van de meeste eilanden, minder kilometers draaien dan in Europa. Dus extra maanden garantie geven in Oceanië? MGIM durft dat, na een uitgebreide risicoanalyse, wel aan.

MGIM besluit twee interfaces te bouwen, een interface voor Europa en een interface voor Oceanië. Elke interface zal, gezien de karakteristieken van die gebieden, anders geïmplementeerd worden. De interfaces bevatten allebei een methode met de naam AantalMaandenGarantie():

public interface IOceanie
{
 int AantalMaandenGarantie();
}

public interface IEuropa
{
  int AantalMaandenGarantie();
}

up | down

Klasse

Klasse MGIM gebruikt meerdere interfaces en de IEuropa en de IOceanie interfaces worden verschillend geïmplementeerd. Het resultaat van de implementatie is dat de garantietermijn in Europa zes maanden is en in Oceanië negen. Het is geen probleem dat in beide interfaces een methode AantalMaandenGarantie() aanwezig is.

public class MGIM : IMarktwerking, IEuropa, IOceanie
{
  .
  .
  int IEuropa.AantalMaandenGarantie()
  {
   // allerlei moeilijke berekeningen
   // die de wenselijke garantietermijn
   // bepalen, maar we retourneren for 
   // simplicity alleen maar een getal.
   // Ze gebruiken in Europa de auto's
   // nu eenmaal wat intensiever dus
   // niet te lang garantie geven... 
   return 6;
  }
  
  int IOceanie.AantalMaandenGarantie()
  {
   // allerlei moeilijke berekeningen
   // die de wenselijke garantietermijn
   // bepalen, maar we retourneren for 
   // simplicity alleen maar een getal
   // Overmatige slijtage door tsunami's,
   // aardbevingen en orkanen vallen niet
   // onder de garantie, dus no problemo.
   return 9;
  }
}

up | down

Object

We instantiëren een myMGM-object. Methode AantalMaandenGarantie() komt voor in interface IEuropa en in interface IOceanie. Het gaat goed als je bij het aanroepen van de methode ook de interface opgeeft. De compiler weet dan wat precies aangeroepen moet worden.

// Instantieer
 MGIM myMGIM = new MGIM(
"MGIM(Migraine Imperialist Motors Corporation Groupe)", 
(int)Kleur.Grijs);

// En we hebben...
Console.WriteLine(
"Gegevens van uw auto:");

Console.WriteLine(
"- Merk: {0}", myMGIM.Merk);

Console.WriteLine(
"- Kleur milieusticker: {0}", 
(Kleur)myMGIM.MilieuSticker);

Console.WriteLine(
"- Vervuilingsgraad: {0}", 
myMGIM.Vervuilingsgraad);

Console.WriteLine(
"- Genomen milieumaatregel: {0}", 
myMGIM.GenomenMilieuMaatregel());

Console.WriteLine(
"- Aantal maanden garantie in Europa: {0}",
((IEuropa)myMGIM).AantalMaandenGarantie());

Console.WriteLine(
"- Aantal maanden garantie in Oceanië 
(excl. Nieuw-Guinea, Australië en 
 Nieuw Zeeland): {0}",
((IOceanie)myMGIM).AantalMaandenGarantie());

En het uiteindelijke resultaat. We zien dat in Europa de garantietermijn zes maanden is en in Oceanië negen.

Gegevens van uw auto:
- Merk: MGIM(Migraine Imperialist 
        Motors Corporation Groupe)
- Kleur milieusticker: Grijs
- Vervuilingsgraad: 
  The environment does not care us 
  what cares is you buying our cars.";
- Genomen milieumaatregel: 
  Buzz off, we have better things to do.
- Aantal maanden garantie in Europa: 6
- Aantal maanden garantie in Oceanië 
  (excl. Nieuw-Guinea, Australië en
   Nieuw Zeeland): 9

up | down

Slot

Ik heb in deze post laten zien hoe een klasse gevormd kan worden door meerdere interfaces. De interfaces kunnen een methode bevatten met dezelfde naam. In C# is het niet mogelijk van meerdere klassen te erven.

Zo wordt in het voorbeeld in deze post klasse MGIM gevormd door drie interfaces (IMarktwerking, IEuropa, IOceanie) en methode AantalMaandenGarantie() is in twee interfaces aanwezig. Het implementeren en het aanroepen van die methode gaat goed als je elke keer de naam van de interface opgeeft.

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

De interfaces die in een aparte class module zijn gezet:

using System;

namespace OverheidsRegulering
{
  public interface IMarktwerking
  {
    // Properties
    string Merk { get; set; }
    int MilieuSticker { get; set; }
    string Vervuilingsgraad { get; }
    string MilieuMaatregel { get; }
    
    // Methods
    string OverJeAuto(int kleur);
    string GenomenMilieuMaatregel();  
  }

  public interface IOceanie
  {
    int AantalMaandenGarantie();
  }
  
  public interface IEuropa
  {
    int AantalMaandenGarantie();
  }
}

Implementatie van de interfaces:

using System;
using OverheidsRegulering;
namespace Implementatie
{
 // Enumeratie
 enum Kleur
 {
  Groen, Paars, Geel, 
  Oranje, Rood, Grijs
 }

 public class MGIM : IMarktwerking, IEuropa, IOceanie
 {
  // Backing variables - fields
  private string _merk;
  private int _milieusticker;
  private string _vervuilingsgraad;
  private string _milieumaatregel;

  // Constructor - twee parameters zijn opgegeven
  public MGIM(string merk, int milieusticker)
  {
    _milieusticker = milieusticker;
    _merk = merk;
    _vervuilingsgraad = OverJeAuto(milieusticker);
    _milieumaatregel = GenomenMilieuMaatregel();
  }

  // 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; }
  }
  // Property MilieuMaatregel
  public string MilieuMaatregel
  {
    get { return _milieumaatregel; }
  }
    
  // die stomme milieumaatregelen
  // gaan alleen maar ten koste van 
  // de winst voor de aandeelhouders
  public string GenomenMilieuMaatregel()
  {
    return "Buzz off, 
            we have better things to do.";
  }
  // lekker belangrijk, wat interesseert
  // de milieusticker kleur en de 
  // vervuilingsgraad ons nou?
  public string OverJeAuto(int kleur) {
    return "The environment does not care us  
    what cares is you buying our cars.";
  }

  int IEuropa.AantalMaandenGarantie()
  {
   // allerlei moeilijke berekeningen
   // die de wenselijke garantietermijn
   // bepalen, maar we retourneren for 
   // simplicity alleen maar een getal.
   // Ze gebruiken in Europa de auto's
   // nu eenmaal wat intensiever dus
   // niet te lang garantie geven... 
   return 6;
  }

  int IOceanie.AantalMaandenGarantie()
  {
   // allerlei moeilijke berekeningen
   // die de wenselijke garantietermijn
   // bepalen, maar we retourneren for 
   // simplicity alleen maar een getal
   // Overmatige slijtage door tsunami's,
   // aardbevingen en orkanen vallen niet
   // onder de garantie, dus no problemo.
   return 9;
  }
 }
 .
 //--------------
 // Klasse MainClass
 //--------------
 .
}

Het object instantiëren:

using System;
using OverheidsRegulering;
namespace Implementatie
{
 .
 //--------------
 // Klasse MGIM..
 //--------------
 .
 class MainClass
 {
  public static void Main(string[] args)
  {   
    // Instantieer
    MGIM myMGIM = new MGIM(
    "MGIM(Migraine Imperialist Motors 
     Corporation Groupe)", 
    (int)Kleur.Grijs);

    Console.WriteLine("Gegevens van uw auto:");

    Console.WriteLine(
    "- Merk: {0}", myMGIM.Merk);
      
    Console.WriteLine(
    "- Kleur milieusticker: {0}", 
    (Kleur)myMGIM.MilieuSticker);
    
    Console.WriteLine(
    "- Vervuilingsgraad: {0}", 
    myMGIM.Vervuilingsgraad);
     
    Console.WriteLine(
    "- Genomen milieumaatregel: {0}", 
    myMGIM.GenomenMilieuMaatregel());

    Console.WriteLine(
    "- Aantal maanden garantie in Europa: {0}",
    ((IEuropa)myMGIM).AantalMaandenGarantie());

    Console.WriteLine(
    "- Aantal maanden garantie in Oceanië 
    (excl. Nieuw-Guinea, Australië en 
    Nieuw Zeeland): {0}",
    ((IOceanie)myMGIM).AantalMaandenGarantie());
  }
 }
}

up

Laat een reactie achter

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