CSharp Classes
Simple class
Objekt orienteret programmering er en måde at samle sine data på, et objekt kunne f.eks. være en person eller en bil. Disse objekter beskrives i klasser.
Attributes
Attributter er de variable som fortæller noget om klassens objekter. Vi kunne forestille os klassen Person skulle indeholde oplysninger om Navn og Alder.
I CSharp ville klassen se sådan ud.
class Person { public string navn; public int alder; }
Klassen Person indeholder altså variablen navn af type string og alder af typen int. Disse variable kaldes for klassens attributter.
Når vi skal anvende klassen Person foregår det på følgende måde
Person bruger1; bruger1 = new Person(); bruger1.navn = "Ole"; bruger1.alder = 20;
Vi fortæller her at bruger1 er af typen Person, vi erklærer variablen bruger1. Efterfølgende initialisere vi bruger1 son en ny Person. Til sidst giver vi bruger1 navnet Ole og alderen 20.
Vi har nu samlet alle oplysninger om Ole i Objektet bruger1 af typen Person (Klasse). Objektet har Attributterne navn og alder. Vi siger at bruger1 er en instans af klassen Person og at klassen er blevet instantieret.
Fordelen er at vi nu kan oprette mange forskellige Personer som alle har hvert sit navn og alder.
På samme måde kunne vi definere klassen bil. Klassen har attributterne fabrikat og ejer.
class Bil { public string fabrikat; public Person ejer; }
Bemærk at fabrikat er af typen string mens ejer er af typen Person. Vi anvender altså Person som en type på lige fod med string, int og alle andre variabel typer.
Vi kan nu bruge de to klasser på følgende måde
Person bruger1 = new Person(); bruger1.navn = "Ole"; bruger1.alder = 20; Bil farsBil; farsBil = new Bil(); farsBil.fabrikat = "Volvo"; farsBil.ejer = bruger1;
Bemærk hvordan Personen bruger1 indsættes som ejer i farsBil.
Hvis vi efterfølgende vil udskrive navnet på den Person som ejer farsBil kan vi skrive
Console.WriteLine(farsBil.ejer.navn);
Bemærk hvordan vi med punktum arbejder os ned igennem klasserne, startende med farsBil af typen Bil. På farsBil vælger vi attributten ejer der er af typen Person. På ejer vælger vi attributten navn der er af typen string.
Methods
Mens attributter er statiske oplysninger om objektet kan man også lave metoder (funktioner) som udfører noget. I eksemplet Person havde vi attributten alder, men det er jo noget der hele tiden ændre sig. I stedet kan vi lave attributten foedselsdag og lave metoden beregnAlder som returnere den aktuelle alder ud fra datoen her og nu.
class Person { public string navn; public DateTime foedselsdag; public int beregnAlder() { int alder; alder = DateTime.Now.Year - foedselsdag.Year; return alder; } }
Metoden beregn alder returnerer et resultat af typen int. Denne kan efterfølgende anvendes som vist
Person bruger1 = new Person(); bruger1.navn = "Ole"; bruger1.foedselsdag = new DateTime(1995, 12, 24); Console.WriteLine(bruger1.beregnAlder());
Ole har nu fået foedselsdag juleaften 1995 og når vi vil udskrive hans alder, sker det ved at kalde metoden beregnAlder() på bruger1. Da det er en metode (funktion) vi kalder skal der sættes en parentes efter metodenavnet. Du kan læse mere om CSharp og metoder her CSharp Methods
Constructor
En constructor er en metode som kaldes når vi opretter en ny instans af klassen. Hvis man ikke laver en constructor laver CSharp en default constructor. Her har vi lavet en constructor på klassen Bil.
class Bil { public string fabrikat; public Person ejer; public Bil(Person p) { ejer = p; } }
Consturctoren tager en input parameter p af typen Person og gemme i sin lokale ejer. Når vi skal anvende klassen foregår det således.
Person bruger1 = new Person();
bruger1.navn = "Ole"; bruger1.foedselsdag = new DateTime(1995, 12, 24); Console.WriteLine(bruger1.beregnAlder()); Bil farsBil; farsBil = new Bil(bruger1);
I constructoren for Bil gemmes den overførte parameter p i attributten ejer. Navnet p er dog ikke særlig godt da det ikke fortæller noget om hvad vi forventer af input. Faktisk var det bedre hvis parameteren også hed ejer, men hvordan kender vi så forskel på den overførte parameter og attributten.