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
Schoolklasse- In de vorige les hebben we de eigensschappen van een
Schoolinstantie geïnitialiseerd nadat we een instantie van eenSchoolklasse 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 deSchoolklasse zie je nergens een constructor met de naamSchoolstaan: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
Schoolklasse 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 deSchoolklasse definiëren. Zelfs al staat er geen code in moeten we die toevoegen aan deSchoolklasse:public School() { // lege constructor } - Nu kunnen we op één lijn een instantie van de klasse
Schoolmaken 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
basekeyword
Een eigen constructor definiëren in klassen die overven van een andere klasse, bijvoorbeeld van een abstracte klasse- De klasse
Lecturererft over van de abstracte klassePerson - We schrijven een eigen constructor voor de klasse
Lecturerdie 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
Studentklasse. Dan moeten we ook inStudenteen 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
Personklasse. We voegen dus een constructor toe in dePersonklasse die de properties vanPersoninitialiseert: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
Lecturerklasse: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
Studentklasse: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
CourseenTheoryCourse
vereisten (allemaal autoproperties, behalve de werkbelasting; dat is een abstracte methode)TheoryCourseTitleCalculateWorkload() (uint, op basis formule)StudyPoints(byte)
LabCourseTitleCalculateWorkload()(twee keer het aantal studiepunten)StudyPointsMaterials(string)
Seminar (zelf te schrijven)TitleCalculateWorkload()(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
Studentdie gebruik maakt vanbase - Aanmaken van de constructoren
LecturerenAdministrativeStaffdie gebruik maken vanbase(doorgespoeld in het filmpje) - Al je toepassingen van een default constructor omzetten in toepassingen van deze nieuwe constructoren
- Aanmaken van
CourseenTheoryCoursemet juiste properties en constructor - Aanmaken van
LabCourseenSeminar(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 protectedmaken vanBirthDay
- Aanmaken van de constructor voor
-
Voeg een protected property
ContactNumber(van typestring) toe aanPersonen zorg dat deconstructoren dit ook aannemen; zorg dat dit getoond wordt op de naamkaartjes van personeel(LecturerenAdministrativeStaff) 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