Som med alle andre objektorienterte språk har også C# klasser:
abstract class GeometriskObjekt { public abstract double areal(); public abstract double omkrets(); public override string ToString() { return "Dette er et uspesifisert geometrisk objekt."; } }
Her opprettes en abstrakt klasse som det dermed ikke kan lages instanser av, den legger kun føringer for hva underklasser må inneholde.
Disse underklassene blir mer spesialiserte, f.eks. kan man lage èn klasse for firkant, èn for rektangel, og èn for sirkel:
class Firkant : GeometriskObjekt { public int Lengde { get { return lengde; } } private int lengde; public Firkant(int lengde) { this.lengde = lengde; } public override double areal() { return lengde*lengde; } public override double omkrets() { return lengde * 4; } public override string ToString() { return String.Format("Firkant med sider={0:0.00}.", lengde); } }
sealed class Rektangel : Firkant { public int Bredde { get { return bredde; } } private int bredde; public Rektangel(int lengde, int bredde) : base(lengde) { this.bredde = bredde; } public override double areal() { return bredde * Lengde; } public override double omkrets() { return bredde * 2 + Lengde * 2; } public override string ToString() { return String.Format("Rektangel med lengde={0:0.00} og bredde={1:0.00}.", Lengde, bredde); } }
sealed class Sirkel : GeometriskObjekt { public int Radius { get { return radius; } } private int radius; public Sirkel(int radius) { this.radius = radius; } public override double areal() { return Math.PI * radius * radius; } public override double omkrets() { return 2 * Math.PI * radius; } public override string ToString() { return String.Format("Sirkel med radius={0:0.00}.", radius); } }
Ingen av konstruktørene er særlig kompliserte. Firkant trenger kun en lengde, og Rektangel som arver fra Firkant trenger dermed bare bredde. Sirkel derimot må ha radius.
For konstruktøren i Rektangel må lengden videreformidles til konstruktøren i Firkant, via : base(lengde) ellers ville ikke denne blitt initialisert.
Når det gjelder metoder blir areal og omkrets overstyrt i hver underklasse for å gi de tilpasset innhold. Metoden ToString er også overstyrt, men dette er mer frivillig.
Og siden klassene Rektangel og Sirkel ikke trenger nye underklasser blir disse forseglet ved å benytte sealed.
Dermed gjenstår testingen for å se klassene i praksis:
static void Main(string[] args) { object[] objekter = new object[5] { new Firkant(2), new Rektangel(2, 3), "tekst ...", "tekst ...", new Sirkel(1) }; foreach (var o in objekter) { if (o is GeometriskObjekt) { GeometriskObjekt objekt = (GeometriskObjekt)o; Console.Write(objekt); Console.Write(" "); Console.Write(String.Format("Areal={0:0.00}.", objekt.areal())); Console.Write(" "); Console.Write(String.Format("Omkrets={0:0.00}.", objekt.omkrets())); Console.WriteLine(); } else { Console.WriteLine("..."); } } Console.ReadLine(); }
.. som gir:
For hvert objekt som gjenkjennes som GeometriskObjekt kjøres metodene ToString, areal, og omkrets. Men innholdet som gjengis er et resultat av dataene i hver individuelle instans.