Algoritmiek Class Hierarchies, Inheritance. Hoorcollege 12 - Ma. 20 nov L.M. Bosveld-de Smet
Kerneigenschappen van O-O design Abstraction: abstractie Encapsulation: inkapseling Inheritance: overerving Polymorphism: veelvormigheid Interface
Hergebruik van code Packages: bibliotheken van klassen Geleverd bij programmeertaal Geleverd door programmeurs Hergebruik van bestaande klassen in nieuwe klassen
Hierarchische structuur vervoer wegvervoer personenvervoer goederenvervoer vierwielerstweewielers autobusambulancefietsscootermotor vrachtwagentractorcontainerwagen
Hierarchie van personen
Hierarchie van klassen in Java superclass subclasses Class data fields & methods
“is een” versus “heeft (een)” verband Auto Is een vierwieler Is een vervoersmiddel voor personen Is een vervoersmiddel voor de weg Heeft een motor Heeft een ruitenwisser Heeft wielen
Java’s implementatie public class Car extends MotorVehicle { Wheels[] w = new Wheels[4]; … }
Inheritance: overerving vadermoeder jij
Class hierarchie en Inheritance shape ellipse circle rectangle polygon square triangle
Inheritance Tree superclass/ancestor Subclasses/descendants parent children
Terminologie Inheritance, derivation, extension Single inheritance Multiple inheritance Superclass: base class Subclass: derived class Parent/Child class Ancestor/Descendant class
Inheritance: impliciete overdracht van data fields en methods van superclass naar subclass
Nut van class hierarchie (1)
Nut van class hierarchie (2)
Hierarchie van Employee classes NewEmployee Object HourlyEmployeeSalaryEmployee
Data fields and Methods name, socSecNum, jobTitle, address, phoneNumber, age, startYear, totalPay setName(), setSocial(), setJob, setAddress(), setPHone(), setAge(), setStartYear(), setTotalPay(), getName(), getSocial(), getJob, getAddress(), getPhone(), getAge(), getStartYear(), getTotalPay(), calcYearsService(), calcYearsToRetire(), equals(), updateTotalPay(), toString() NewEmployee (Subclass of Object) name, etc. annualSalary setName(), etc. setSalary(), getSalary(), calcWeeklyPay(), toString() name, etc. hours, rate setName(), etc. setHours(), setRate(), getHours(), getRate(), calcWeeklyPay(), toString() HourlyEmployee (Subclass of NewEmployee) SalaryEmployee(Subclass of NewEmployee)
Sample run class TestEmployeeClasses
Operaties in een class hierarchie “Method Overloading” “Method Overriding” Zichtbaarheid van afgeschermde data fields Protected data fields Prefix this Prefix super Assignments in een class hierarchie “Casting” in een class hierarchie Objecten als argumenten doorgeven instanceof operator
Assignments in een class hierarchie: Object en NewEmployee objecten Object obj; NewEmployee anEmp = new NewEmployee(“Sam”, “1111”) Sam 1111 ……………… null anEmp obj
Assignment in een class hierarchie: HourlyEmployee object HourlyEmployee hourEmp = new HourlyEmployee(“Sally”, “2222”) Sally 2222 ……………… hourEmp hours rate
Assignment in een class hierarchie: SalaryEmployee object SalaryEmployee salEmp = new SalaryEmployee(“Tony”, “2345”) Tony 2345 ……………… salEmp annualSalary
Assignments in een class hierarchie: superclass type en subclass type Sam 1111 ……………… null anEmp obj Object type NewEmployee type
Assignment in een class hierarchie: toekenning van NewEmployee type aan Object type obj = anEmp; System.out.println (obj.toString()); name:Sam, social security:1111, job:, address:, phone:, age:0, year started:0, total pay:$0.0 Sam 1111 ……………… anEmp obj
Assignment in een class hierarchie: toekenning van HourlyEmployee type aan type anEmp = hourEmp; System.out.println (anEmp.toString()); name:Sam, social security:1111, job:, address:, phone:, age:0, year started:0, total pay:$0.0, weekly hours:0.0, hourly rate: $0.0 Sally 2222 ……………… hourEmp hours rate anEmp
Assignments in een class hierarchie: Toekenning van type aan hoger type is toegstaan: assignment “up the tree”: YES Toekenning van type aan lager type is niet toegestaan: assignment “down the tree”: NO hourEmp = anEmp;//incompatible types salEmp = anEmp;//incompatible types Sam 1111 ……………… anEmp hourEmp salEmp NO
“Casting down” in een class hierarchy hourEmp = anEmp; //incompatible types hourEmp = (HourlyEmployee) anEmp; “Assignment down the tree” is toegestaan, als het toe te kennen object gecast wordt naar het goede type en naar het overeenkomstige type verwijst Sally 2222 ……………… hourEmp hours rate anEmp
Objecten aan argumenten doorgeven // postcondition: returns true if this object // has the same security number as the argument. public boolean equals (NewEmployee emp) { return this.socSecNum.equals(emp.socSecNum); } if (clerk.equals (supervisor)) System.out.println (clerk.getName() + " and " + supervisor.getName() + " are same eployee."); else System.out.println (clerk.getName() + " and " + supervisor.getName() + " are different employees.");
instanceof operator public boolean equals (Object emp) { if (emp instanceof NewEmployee) { NewEmployee temEmp = (NewEmployee) emp; return this.socSecNum.equals (temEmp.socSecNum); } else { return false; }