- 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(); } }