290 likes | 379 Views
Velkommen til Softwarekonstruktion. Aase Bøgh , aabo@noea.dk : Systemudvikling Martin Siegumfeldt, mars@noea.dk : Programmering og databaser. Agenda. Opsamling fra sidste gang Grundlæggende objektorienteret programmering OOP i C# 1 – individuelle objekter
E N D
Velkommen tilSoftwarekonstruktion • Aase Bøgh, aabo@noea.dk: Systemudvikling • Martin Siegumfeldt, mars@noea.dk: Programmering og databaser
Agenda Opsamling fra sidste gang Grundlæggende objektorienteret programmering OOP i C# 1 – individuelle objekter OOP i C# 2 – relationer mellem objekter
Opgaver fra sidst: sweep- og søgeskabeloner • For alle opgaverne skal det overvejes hvilken skabelon, der benyttes, og hvordan operationerne er konkretiseret: • Lav en metode, som returnerer antallet af lige tal i et int[ ]. Test den. (Vink: et tal er lige, hvis rest ved division med 2 er 0) • Lav en metode, som returnerer antallet af tal i et double[ ], som ligger mellem 10,0 og 20,0. Test den. • Lav en metode, som tager en int x som parameter, og returnerer true, hvis x findes i et int [ ]. Ænder metoden, så index på første forekomst af x i arrayet returneres. • Lav en metode, som finder første forekomst af et tegn i et char[ ]. • Lav en metode, som finder antallet af vokaler i et char[ ]. (Vink: lav først en metode, som tager et bogstav som parameter, og returnerer true, hvis bogstavet er en vokal, ellers false.)
Agenda Opsamling fra sidste gang Grundlæggende objektorienteret programmering OOP i C# 1 – individuelle objekter OOP i C# 2 – relationer mellem objekter
C# programstruktur • Normalt vil et C#-program bestå af en række klasser • disse beskriver objekter i problemområdet, f.eks Kunde, Konto, Vare mv • Mindst en af disse skal indeholde en ”Main” metode, der er programmets startpunkt (entry point) • Objekter oprettes (instantieres på baggrund af klasser) • Vilkårligt antal objekter kan oprettes fra samme klasse • En klasse definerer objekternes • Tilstand gennem variable (variable) • Adfærd gennem metoder (og properties (”egenskaber”)) • Objekter interagerer gennem referencer og ved at kalde hinandens metoder
C#- objekter og klasser • Klassen er definitionen af typen • Indeholder metoder, instansvariable, constructors og properties • Objektet er den faktiske forekomst • Alle klasser arver fra ”System.Object”, dvs. har nogle fælles egenskaber, som gælder for alle objekter: • Indeholder bl.a. ToString() og Equals() • Objekter oprettes med keyword: ”new”
Agenda Opsamling fra sidste gang Grundlæggende objektorienteret programmering OOP i C# 1 – individuelle objekter OOP i C# 2 – relationer mellem objekter
Eksempel på en klasse class Student //definition af en klasse { private string navn; //instansvariable private string adresse; private int alder; public Student(string navn, string adr, int alder) //constructor { this.navn = navn; this.adresse = adr; this.alder = alder; } public override String ToString() //medlemsfunktion { return navn + " " + adresse + " " + alder; } }
Eksempel på brug af klasse/objekt i C# class MainClass //klasse indeholdende Main { static void Main(string[] args) { Student s = new Student("Carl", "Bygaden", 34); //oprettelse af objekt Console.WriteLine(s.ToString()); //kald til objektets metode } }
Class anatomi • Attributterer definition af variable som er knyttet til klassen • <modifiers> <datatype> <navn> • Metoder er en række statements, der udføres (typisk på attributterne) ved en kommando, ved kald af metoden <modifiers> <returtype> <navn>(<parameterliste>){ //kode….. }
Constructors • Constructors opgave er at initialisere objektet, dvs. tildele instansvariablene en startværdi • Har samme navn som klassen og ingen returtype • Kaldes under objektoprettelse: • Student s = new Student("Carl”,”Bygaden”, 34); • s er en reference til et objekt af typen Student • new skaffer (allokerer) lager til objektet, og kalder klassen Students constructor med de værdier (parametre), som objektets attributter skal initialiseres med.
Objekt initialisering Objektreferencer er basalt set variable: Student s = new Student("Carl","Bygaden",34); Venstre siden er erklæring af en variabel af typen ”Student” - bemærk ligheden til erklæring af simple variable: ”int x;” Højre siden er en værdi-tildeling: s = new Student("Carl","Bygaden",34);
Objekt manipulation • Metoder kaldes ved ”dot (”.”)”-notation (dereference): • s.ToString() • Objekters tilstand: refererer til attributternes værdi • Objekters adfærd: refererer til objektets metoder • Ændring og aflæsning af objekters tilstand bør forgå ved metodekald eller i C# ved brug af properties (se næste slide)
Properties …i class Student: private string navn; private int alder; public string Navn{ get{ return navn;} set{ navn= value;} } public int Alder{ //read-only get{ return alder;} } • Særlig syntaks for set- og get-metoder, så det ligner tildeling til variable, men det er metodekald! • Konventionen er at en property hedder det samme som attributten, men med stort begyndelsesbogstav • Properties kontrollerer adgangen til attributten, fx read-only
Indkapsling • Man må ikke kunne ændre/aflæse objektets tilstand (attributter) direkte, men kun vha. metoder • Ideen i dette princip er • at man kun skal kunne ændre i et objekts tilstand ved at overholde nogle regler, som er defineret i metoderne • Til hjælp til at overholde sådanne principper bruge visibility modifiers (public/private)
Øvelse: • Implementer klassen Fag • Constructor kunne være • Fag(string betegn, int kar) • Et fag er bestået, hvis karakteren er mindst 6 (vi bruger stadig den gamle skala) • Tips • Start med en tom klasse – kompiler • Tilføj constructor – kompiler og test • Tilføj attributter – kompiler • Tilføj properties – kompiler og test • Tilføj metoder – kompiler og test
Eksempler med referencetyper • Oprettelse, assignment og sammenligning: Customer c1, c2, c3; c1 = new Customer("Flemming Sander", 36259); c2 = new Customer(”Bjarne Riis", 55298); c3 = null; // c3 refererer ingenting c3 = c1; // c3 refererer samme objekt som c1 if (c1 == null) ... // refererer c1 et objekt? if (c1 == c2) ... // sammenligner referencer if (c1.Equals(c2)) ... // sammenligner objekter
Hvornår er objekter ens? • Klasser bør override Equals-metoden public class Customer { private int id; . . public override bool Equals(object obj) { Customer other; if ((obj == null) || (!(obj is Customer))) return false; // helt sikkert ikke ens other = (Customer) obj; // typecast for adgang return this.id == other.id; // ens hvis ens id... }
Metode kald class MainClass{ //klasse indeholdende Main static void Main(string[] args) { Student s = new Student("Carl", "Bygaden", 34); //oprettelse af objekt Console.WriteLine(s.ToString()); //kald til objektets metode s.Adresse ="Nygade"; s.FyldAar(); Console.WriteLine(s.Adresse + " " + s.Alder); } }
Agenda Opsamling fra sidste gang Grundlæggende objektorienteret programmering OOP i C# 1 – individuelle objekter OOP i C# 2 – relationer mellem objekter
Tilbage til studerende og fag Vi vil lave en forbindelse mellem Student og Fag: • Den kan realiseres ved at definere en attribut i Student af typen fag • Denne attribut skal have defineret properties
Referencen defineres class Student{ //… private int alder; private Fag følger; public int Alder{//read-only get{ return alder;} } public Fag Følger{ get{ return følger;} set{ følger= value;} } } Property’en Følger bruges til at tildele værdier og aflæse referencen
static void Main(string[] args){ Student s = new Student("Carl","Bygaden",34); Console.WriteLine(s.ToString()); //kald til objektets metode s.Adresse= "Nygade"; s.FyldAar(); Console.WriteLine(s.Adresse+" "+s.Alder); Fag f= new Fag("Softwarekonstruktion",-1); s.Følger= f; Console.WriteLine(s.ToString()+" "+s.Følger.ToString()); s.Følger.Karakter= 11; Console.WriteLine(s.ToString()+" "+s.Følger.ToString()); } Kalder ToString på Fag Består eksamen
Tilbage til studerende og fag Vi vil lave en forbindelse mellem Student og Fag, men en studerende skal kunne have flere fag: • I stedet for en attribut skal vi have en liste af fag • Vi skal finde metoder til at vedligeholde listen: • TilføjFag(Fag f) • UdskrivFag()
ArrayList: En klasse, som indkapsler et array af objekter, og har nyttige metoder: ArrayList s= new ArrayList(); s.Clear(); s.Insert(i,e); s.RemoveAt(i); s.Add(e); s.Count; s[i] int x= s[i]; s[i]= x;
Eksempel using System; using System.Collections; class TestSeqInt{ privatestatic ArrayList sekvens = new ArrayList(); staticvoid Main(){ for(int i= 0; i<10; i++) sekvens.Add(i); Udskriv(sekvens); sekvens[4]=1111; Console.WriteLine(sekvens[4]); sekvens.Insert(4,44); Udskriv(sekvens); } publicstaticvoid Udskriv(ArrayList s){ for(int i= 0; i<s.Count; i++) Console.WriteLine(s[i]); } }
ArrayList af fag på Student class Student{ //definition af en klasse private ArrayList følger; public Student(string navn, string adr,int alder){ //constructor //… følger= new ArrayList(); } public void TilføjFag(Fag f){ følger.Add(f); } public void UdskrivFag(){ foreach(Fag f in følger) Console.WriteLine(f.ToString()); } }
Test af Student static void Main(string[] args){ Student s = new Student("Carl","Bygaden",34); //oprettelse af objekt Console.WriteLine(s.ToString()); s.Adresse= "Nygade"; s.FyldAar(); Console.WriteLine(s.Adresse+" "+s.Alder); Fag f= new Fag("Softwarekonstruktion",11); s.TilføjFag(f); Fag f2= new Fag("Programmeringsteknologi",-1); s.TilføjFag(f2); s.UdskrivFag(); }
Opgaver 1. Student • Lav en metode på Student, som beregner den studerendes karaktergennemsnit. • Lav en metode, som returnerer sand, hvis den studerende har bestået et givet fag (fagbetegnelse som inputparameter) 2: KundeCD • Lav en klasse Kunde (navn, telefon) • Lav en Main-metode, som tester • Lav en klasse CD (titel, kunstner, pris) • Test den nye klasse • En kunde kan købe en række CD’ere • Lav en ArrayList til CD’ere på Kunde, lav en metode til at tilføje CD’ere og lav en metode til udskrivning af alle CD’ere • Test • Lav en metode på Kunde, som kan finde samlet pris. • Test