Algoritmiek Class Hierarchies, Inheritance. Hoorcollege 12 - Ma. 20 nov. 2006 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 goederenvervoer personenvervoer vierwielers auto bus tweewielers ambulance motor scooter vrachtwagen containerwagen fiets tractor Hierarchie van personen Hierarchie van klassen in Java superclass Class data fields & methods subclasses “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 vader moeder jij Class hierarchie en Inheritance shape polygon triangle ellipse rectangle square circle 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 Object NewEmployee SalaryEmployee HourlyEmployee 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() SalaryEmployee(Subclass of NewEmployee) name, etc. hours, rate setName(), etc. setHours(), setRate(), getHours(), getRate(), calcWeeklyPay(), toString() HourlyEmployee (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 obj Object obj; NewEmployee anEmp = new NewEmployee(“Sam”, “1111”) null anEmp Sam 1111 … … … Assignment in een class hierarchie: HourlyEmployee object HourlyEmployee hourEmp = hourEmp new HourlyEmployee(“Sally”, “2222”) Sally 2222 … … … hours rate Assignment in een class hierarchie: SalaryEmployee object SalaryEmployee salEmp = new SalaryEmployee(“Tony”, “2345”) salEmp Tony 2345 … … … annualSalary Assignments in een class hierarchie: superclass type en subclass type Object type NewEmployee type obj null anEmp Sam 1111 … … … Assignment in een class hierarchie: toekenning van NewEmployee type aan Object type obj obj = anEmp; anEmp System.out.println (obj.toString()); Sam 1111 … name:Sam, social security:1111, job: , address: , phone: , age:0, year started:0, total pay:$0.0 … … Assignment in een class hierarchie: toekenning van HourlyEmployee type aan type anEmp 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 hourEmp Sally 2222 … … … hours rate Assignments in een class hierarchie: Toekenning van type aan hoger type is toegstaan: assignment “up the tree”: YES anEmp Toekenning van type aan lager type is niet toegestaan: assignment “down the tree”: NO Sam 1111 … NO … hourEmp = anEmp;//incompatible types … salEmp = anEmp;//incompatible types hourEmp salEmp NO “Casting down” in een class hierarchy anEmp hourEmp = anEmp; //incompatible types hourEmp Sally 2222 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 … hours rate 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; } }