OO Programmeren Labo 11 Overerving en constructoren
We gaan ervan uit dat je de vorige les (OO Programmeren Labo 9 en 10 Overerving en abstractie) hebt afgewerkt.
Doelstellingen
In dit labo leer je:
- gebruik maken van de protected access modifier
- niet-default constructors gebruiken bij overerving
- constructors gebruiken in combinatie met
base
- het bassiconcept van polymorfisme
Theorie
Labo
- Een eigen constructor definiëren in de
School
klasse- In de vorige les hebben we de eigensschappen van een
School
instantie geïnitialiseerd nadat we een instantie van eenSchool
klasse hadden gemaakt met behulp van de default constructor:School school1 = new School(); school1.Name = "GO! BS de Spits"; school1.Street = "Thonetlaan 106"; school1.PostalCode = "2050"; school1.City = "Antwerpen"; school1.Id = 1;
Een default constructor is een constructor die we niet zelf moeten schrijven maar die door de C# compiler automatisch gemaakt wordt. In deSchool
klasse zie je nergens een constructor met de naamSchool
staan:using System.Collections.Generic; namespace SchoolAdmin { class School { private string name; public string Name { get { return name; } set { if (!string.IsNullOrEmpty(value)) { this.name = value; } } } public string Street { get; set; } public string PostalCode { get; set; } public string City { get; set; } public int Id { get; set; } public static List<School> List; public static string ShowAll() { string text = "Lijst van scholen:\n"; foreach (var school in School.List) { text += $"{school.Name}, {school.Street}, {school.City}, {school.Id}\n"; } return text; } public string ShowOne() { return $"Gegevens van de school: {this.Name}, {this.Street}, {this.City}, {this.Id}"; } } }
- Telkens we instantie van de
School
klasse maken moeten we alle properties oplijsten om er een waarde aan toe te kennen. Het is veel gemakkelijker om een constructor te schrijven ,die niet alleen een instantie van de klasse maakt maar tegelijk ook waarden toekent aan de properties. We voorzien bestaandeSchool
-klasse van een eigen constructor die precies dat gaat doen:public School(string name, string street, string postalCode, string city, int id) { this.Name = name; this.Street = street; this.PostalCode = postalCode; this.City = city; this.Id = id; }
- Vermits we een eigen constructor hebben gedefiniëerd kunnen we de default constructor
School()
niet meer gebruiken tenzij we die zelf expliciet in deSchool
klasse definiëren. Zelfs al staat er geen code in moeten we die toevoegen aan deSchool
klasse:public School() { // lege constructor }
- Nu kunnen we op één lijn een instantie van de klasse
School
maken en aan de properties waarden toekennen. In plaats van 12 lijnen:var school1 = new School(); school1.Name = "GO! BS de Spits"; school1.Street = "Thonetlaan 106"; school1.PostalCode = "2050"; school1.City = "Antwerpen"; school1.Id = 1; var school2 = new School(); school2.Name = "GO! Koninklijk Atheneum Deurne"; school2.Street = "Fr. Craeybeckxlaan 22"; school2.PostalCode = "2100"; school2.City = "Deurne"; school2.Id = 2;
Hebben we nu 2 lijnen:var school1 = new School("GO! BS de Spits", "Thonetlaan 106", "2050", "Antwerpen", 1); var school2 = new School("GO! Koninklijk Atheneum Deurne", "Fr. Craeybeckxlaan 22", "2100", "Deurne", 2);
- In de vorige les hebben we de eigensschappen van een
- Het
base
keyword
Een eigen constructor definiëren in klassen die overven van een andere klasse, bijvoorbeeld van een abstracte klasse- De klasse
Lecturer
erft over van de abstracte klassePerson
- We schrijven een eigen constructor voor de klasse
Lecturer
die een instantie maakt van de klasse en de properties initialiseert:public Lecturer(string firstName, string lastName, DateTime birthDay, int id, int schoolId) { this.FirstName = firstName; this.LastName = lastName; this.BirthDay = birthDay; this.Id = id; this.SchoolId = schoolId; this.Courses = new List<Course>(); }
- We doen hetzelfde voor de
Student
klasse. Dan moeten we ook inStudent
een constructor schrijven die de properties initialiseert:public Student(string firstName, string lastName, DateTime birthDay, int id, int schoolId) { this.FirstName = firstName; this.LastName = lastName; this.BirthDay = birthDay; this.Id = id; this.SchoolId = schoolId; }
- We herhalen de vijf assignment statements waarmee we de properties initialiseren. In plaats van die code telkens in de overervende klassen te herhalen, plaatsen we die beter in de 'basis' klasse, in ons voorbeeld is dat de abstracte
Person
klasse. We voegen dus een constructor toe in dePerson
klasse die de properties vanPerson
initialiseert:public Person(string firstName, string lastName, DateTime birthDay, int id, int schoolId) { this.FirstName = firstName; this.LastName = lastName; this.BirthDay = birthDay; this.Id = id; this.SchoolId = schoolId; }
- In de afgeleide of overervende klassen gaan we nu de base constructor oproepen i.p.v. van de code telkens opnieuw te herschrijven.
- In de
Lecturer
klasse:public Lecturer(string firstName, string lastName, DateTime birthDay, int id, int schoolId) : base(firstName, lastName, birthDay, id, schoolId) { this.Courses = new List<Course>(); }
En we kunnen nu instanties en properties initialiseren van deze klasse:var lecturer1 = new Lecturer("Adem", "Kaya", new DateTime(1976, 12, 01), 1, 1); Console.WriteLine(lecturer1.ShowTaughtCourses()); var lecturer2 = new Lecturer("Anne", "Wouters", new DateTime(1968, 04, 03), 2, 2);
- In de
Student
klasse:public Student(string firstName, string lastName, DateTime birthDay, int id, int schoolId) : base(firstName, lastName, birthDay, id, schoolId) { }
En we kunnen nu instanties en properties initialiseren van deze klasse:var student1 = new Student("Mohamed", "El Farisi", new DateTime(1987, 12, 06), 1, 1); var student2 = new Student("Sarah", "Jansens", new DateTime(1991, 10, 21), 2, 2); var student3 = new Student("Bart", "Jansens", new DateTime(1991, 10, 21),3,2); var student4 = new Student("Farah", "El Farisi", new DateTime(1987, 12, 06),4,1);
- In de
- De klasse
- We introduceren
Course
enTheoryCourse
vereisten (allemaal autoproperties, behalve de werkbelasting; dat is een abstracte methode)TheoryCourse
Title
CalculateWorkload(
) (uint
, op basis formule)StudyPoints
(byte
)
LabCourse
Title
CalculateWorkload()
(twee keer het aantal studiepunten)StudyPoints
Materials
(string
)
Seminar (zelf te schrijven)
Title
CalculateWorkload()
(altijd 20)
- We herhalen het begrip "abstractie" en introduceren het begrip "polymorfisme"
- We associëren onze lectoren met de cursussen die zij geven via een lijst
Course
-objecten die niet statisch is.
Opdracht
- Volg aandachtig het filmpje.
- Doe alle aanpassingen die gebeuren in het filmpje. Dit houdt in:
- Aanmaken van de constructor voor
School
- Aanmaken van de constructor voor
Person
- Aanmaken van de constructor voor
Student
die gebruik maakt vanbase
- Aanmaken van de constructoren
Lecturer
enAdministrativeStaff
die gebruik maken vanbase
(doorgespoeld in het filmpje) - Al je toepassingen van een default constructor omzetten in toepassingen van deze nieuwe constructoren
- Aanmaken van
Course
enTheoryCourse
met juiste properties en constructor - Aanmaken van
LabCourse
enSeminar
(niet getoond in het filmpje) - Associëren van lectoren met hun cursussen en aanvullen
ShowTaughtCourses()
- Aanmaken van cursus OOP en associëren met
lecturer1
- Aanmaken seminarie Docker en associëren met
lecturer1
protected
maken vanBirthDay
- Aanmaken van de constructor voor
-
Voeg een protected property
ContactNumber
(van typestring
) toe aanPerson
en zorg dat deconstructoren dit ook aannemen; zorg dat dit getoond wordt op de naamkaartjes van personeel(Lecturer
enAdministrativeStaff
) maar niet van studenten. -
Plaats je volledige code op Bitbucket.
-
Experimenteer met verschillende access modifiers om je eigen vragen te beantwoorden.
-
Post je overige vragen over dit onderwerp op het forum.
Vincent Nys
2020-05-15 10:33:22