Interfaces deklarieren

  • Interfaces (Schnittstellen) beschreiben Verhaltensweisen von unabhängigen Objekten (Klassen)
  • implementieren abstrakte, schreibgeschützte Methoden, Eigenschaften und Indexer
using System;
using System.Text;
using System.Management;
using System.Collections.Generic;

// einen Motor definieren
public interface IMotor
{
    int Drehzahl
    {
        get;
    }
}

// einen Display definieren
public interface IDisplay
{
    int Helligkeit
    {
        get;
    }
}

// einen Schalter definieren
public interface ISchalter
{
    bool Status
    {
        get;
    }
}

// Maschine besteht mindestens aus einem Motor und einem Schalter
public interface IMaschine : IMotor, ISchalter
{
    void An();
    void Aus();

    int Gewicht
    {
        get;
    }

    string Name
    {
        get;
    }
}

// Maschine ohne Display, nur mit Motor und Schalter
public class KleineMaschine : IMaschine
{
    private int iMotorDrehzahl = 0;  // Motordrehzahl
    private int iGewicht = 100;  // Gewicht
    private bool bStatus = false;  // Schalterstatus
    private string sName = "-";  // Name der Maschine

    // Konstruktor
    public KleineMaschine(string sBezeichner)
    {
        sName = sBezeichner;
    }

    // Implementation der im Interface IMotor deklarierten Drehzahl
    public int Drehzahl
    {
        get
        {
            return iMotorDrehzahl;
        }

        set
        {
            iMotorDrehzahl = value;
        }
    }

    // Implementation der im Interface ISchalter deklarierten Schalterstellung
    public bool Status
    {
        get
        {
            return bStatus;
        }

        set
        {
            bStatus = value;
        }
    }

    // Implementation des im Interface IMaschine deklarierten Gewichts
    public int Gewicht
    {
        get
        {
            return iGewicht;
        }

        set
        {
            iGewicht = value;
        }
    }

    // Implementation des im Interface IMaschine deklarierten Namens
    public string Name
    {
        get
        {
            return sName;
        }

        set
        {
            sName = value;
        }
    }

    // Implementation der im Interface IMaschine deklarierten Funktion
    public void An()
    {
        Console.WriteLine("{0} ist an, Drehzahl = {1}.", sName, iMotorDrehzahl);
    }

    // Implementation der im Interface IMaschine deklarierten Funktion
    public void Aus()
    {
        Console.WriteLine("{0} ist aus.", sName);
    }
}

// neuen Maschinentyp, abgeleitet von KleineMaschine mit einem zus. Display
public class GrosseMaschine : KleineMaschine, IDisplay
{
    private int iDisplayHelligkeit = 0;

    // Konstruktor der Klasse, ruft den Konstruktor von der Basisklasse "KleineMaschine" auf
    public GrosseMaschine(string sBezeichner)
        : base(sBezeichner)
    {
    }

    // Implementation der im Interface IDisplay deklarierten Displayhelligkeit
    public int Helligkeit
    {
        get
        {
            return iDisplayHelligkeit;
        }

        set
        {
            iDisplayHelligkeit = value;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Liste mit Maschinen
        List<IMaschine> MaschinenListe = new List<IMaschine>();

        // kleine Maschine erzeugen (Motor + Schalter)
        KleineMaschine KM = new KleineMaschine("kleine Maschine");
        KM.Gewicht = 100;
        KM.Drehzahl = 100;
        KM.Status = true;

        MaschinenListe.Add(KM);

        // große Maschine erzeugen (Motor, Schalter, Display)
        GrosseMaschine GM = new GrosseMaschine("große Maschine");
        GM.Gewicht = 200;
        GM.Drehzahl = 1000;
        GM.Helligkeit = 80;
        GM.Status = true;

        MaschinenListe.Add(GM);

        // Liste durchgehen, Objekte wieder herausholen und Möglichkeiten austesten
        foreach (IMaschine ma in MaschinenListe)
        {
            Console.WriteLine(ma.Name + " ist vom Typ " + ma.GetType().ToString());
            Console.WriteLine("Gewicht: {0}kg", ma.Gewicht);

            ma.An();

            // Beispiel: Typ der Maschine ermitteln
            if (ma.GetType() == typeof(KleineMaschine))
            {
                
            }

            // Beispiel: Objekt mit "as" interpretieren
            GrosseMaschine gmObj = ma as GrosseMaschine;

            // wenn sich das Obj. als große Maschine interpretieren lässt,
            // dann besitzt es auch eine Eigenschaft Displayhelligkeit
            if (gmObj != null)
            {
                Console.WriteLine("Die Maschine hat ein Display mit der Helligkeit: {0}", gmObj.Helligkeit);
            }

            // prüfen, ob das Objekt verschiedene Interfaces implementiert
            IMotor iM = ma as IMotor;

            if (iM != null)
            {
                Console.WriteLine("Die Maschine implementiert das Interface IMotor");
            }

            IDisplay iD = ma as IDisplay;

            if (iD != null)
            {
                Console.WriteLine("Die Maschine implementiert das Interface IDisplay");
            }

            ISchalter iS = ma as ISchalter;

            if (iS != null)
            {
                Console.WriteLine("Die Maschine implementiert das Interface ISchalter");
            }
            
            ma.Aus();
        }

        Console.ReadLine();
    }
}