OO Programmeren Labo 11 Overerving en constructoren
Home

OO Programmeren Labo 11 Overerving en constructoren

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:

  1. gebruik maken van de protected access modifier
  2. niet-default constructors gebruiken bij overerving
  3. constructors gebruiken in combinatie met base
  4. het bassiconcept van polymorfisme

Theorie

  1. Constructoren bij overerving
  2. Protected access modifier

Labo

  1. Een eigen constructor definiëren in de School klasse
    1. In de vorige les hebben we de eigensschappen van een School instantie geïnitialiseerd nadat we een instantie van een School 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 de School klasse zie je nergens een constructor met de naam School 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}";
              }
      
          }
      }
      
    2. 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 bestaande School-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;
      }
      
    3. Vermits we een eigen constructor hebben gedefiniëerd kunnen we de default constructor School() niet meer gebruiken tenzij we die zelf expliciet in de School klasse definiëren. Zelfs al staat er geen code in moeten we die toevoegen aan de School klasse:
      public School()
      {
         // lege constructor
      }
    4. 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);
      
  2. Het base keyword
    Een eigen constructor definiëren in klassen die overven van een andere klasse, bijvoorbeeld van een abstracte klasse
    1. De klasse Lecturer erft over van de abstracte klasse Person
    2. 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>();
      }
    3. We doen hetzelfde voor de Student klasse. Dan moeten we ook in Student 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;
      }
    4. 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 de Person klasse die de properties van Person 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;
      }
    5. In de afgeleide of overervende klassen gaan we nu de base constructor oproepen i.p.v. van de code telkens opnieuw te herschrijven.
      1. 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);
        
        
      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);
        
        
  3. We introduceren Course en TheoryCourse
    vereisten (allemaal autoproperties, behalve de werkbelasting; dat is een abstracte methode)
    1. TheoryCourse
      1. Title
      2. CalculateWorkload() (uint, op basis formule)
      3. StudyPoints (byte)
    2. LabCourse
      1. Title
      2. CalculateWorkload() (twee keer het aantal studiepunten)
      3. StudyPoints
      4. Materials (string)
    3. Seminar (zelf te schrijven)
      1. Title
      2. CalculateWorkload() (altijd 20)
  4. We herhalen het begrip "abstractie" en introduceren het begrip "polymorfisme"
  5. We associëren onze lectoren met de cursussen die zij geven via een lijst Course-objecten die niet statisch is.

Opdracht

  1. Volg aandachtig het filmpje.
  2. Doe alle aanpassingen die gebeuren in het filmpje. Dit houdt in:
    1. Aanmaken van de constructor voor School
    2. Aanmaken van de constructor voor Person
    3. Aanmaken van de constructor voor Student die gebruik maakt van base
    4. Aanmaken van de constructoren Lecturer en AdministrativeStaff die gebruik maken van base (doorgespoeld in het filmpje)
    5. Al je toepassingen van een default constructor omzetten in toepassingen van deze nieuwe constructoren
    6. Aanmaken van Course en TheoryCourse met juiste properties en constructor
    7. Aanmaken van LabCourse en Seminar (niet getoond in het filmpje)
    8. Associëren van lectoren met hun cursussen en aanvullen ShowTaughtCourses()
    9. Aanmaken van cursus OOP en associëren met lecturer1
    10. Aanmaken seminarie Docker en associëren met lecturer1
    11. protected maken van BirthDay
  3. Voeg een protected property ContactNumber (van type string) toe aan Person en zorg dat deconstructoren dit ook aannemen; zorg dat dit getoond wordt op de naamkaartjes van personeel(Lecturer en AdministrativeStaff) maar niet van studenten.

  4. Plaats je volledige code op Bitbucket.

  5. Experimenteer met verschillende access modifiers om je eigen vragen te beantwoorden.

  6. Post je overige vragen over dit onderwerp op het forum.

Vincent Nys
JI
2020-05-15 10:33:22