Overerving & Polymorfisme
Overerving • Sommige klassen zijn speciaal geval van andere klasse
• Docent is een speciaal geval van werknemer, dwz. elke docent is ook werknemer
• Functionaliteit van docent = functionaliteit van werknemer + extra’s
Hergebruik van code
public class Werknemer { private Datum geboorteDatum; private String naam; public Werknemer() { } public String getNaam() { return naam; } public void setNaam(String n) { naam = n; } }
public class Docent { private Datum geboorteDatum; private String naam; public Docent() { } public String getNaam() { return naam; } public void setNaam(String n) { naam = n; } private Vak[] vakken; public boolean doceert(Vak v) { for (int i = 0; i < vakken.length; i++) if (vakken[i].equals(v)) return true; return false; } }
public class Werknemer { private Datum geboorteDatum; private String naam; public Werknemer() { } public String getNaam() { return naam; } public void setNaam(String n) { naam = n; } }
public class Docent extends Werknemer {
public Docent() { }
private Vak[] vakken; public boolean doceert(Vak v) { for (int i = 0; i < vakken.length; i++) if (vakken[i].equals(v)) return true; return false; } }
public class Werknemer { private Datum geboorteDatum; private String naam; public Werknemer() { } public String getNaam() { return naam; } public void setNaam(String n) { naam = n; } }
public class Docent extends Werknemer {
public Docent() { }
private Vak[] vakken; public boolean doceert(Vak v) { for (int i = 0; i < vakken.length; i++) if (vakken[i].equals(v)) return true; return false; }
Docent d = new Docent(); d.setNaam("Joost Vennekens"); System.out.println(d.getNaam());
}
public class ComplexGetal { private double reeel; private double imaginair; public ComplexGetal(double r, double i) { reeel = r; imaginair = i; } public ComplexGetal plus(ComplexGetal ander) { return new ComplexGetal(ander.getReeel() + getReeel(), ander.getImaginair() + getImaginair()); } } public class ReeelGetal extends ComplexGetal { public ReeelGetal(double getal) { super (getal, 0); } ReeelGetal r = new ReeelGetal(5.0); } ReeelGetal s = new ReeelGetal(5.0); ComplexGetal som = r.plus(s);
Superklasse
Bankrekening
Subklasse Spaarrekening
Zichtrekening
public class Bankrekening { ... } public class Zichtrekening extends Bankrekening { ... } public class Spaarrekening extends Bankrekening { ... }
public class Rechthoek { private double breedte; private double hoogte; public Rechthoek(double h, double b) { breedte = b; hoogte = h; } public double oppervlakte() { return breedte * hoogt; } public class Vierkant extends Rechthoek { public void draai() { public Vierkant(double grootte) { double tmp = breedte; super (grootte, grootte); breedte = hoogte; } hoogte = tmp; } } Vierkant v = new Vierkant(7.5); } v.draai();
public class Rechthoek { private double breedte; private double hoogte;
Overloading
public Rechthoek(double h, double b) { breedte = b; hoogte = h; } public class Vierkant extends Rechthoek { public double oppervlakte() { public Vierkant(double grootte) { return breedte * hoogte; super (grootte, grootte); } } public void draai() { public void draai() { double tmp = breedte; } breedte = hoogte; } hoogte = tmp; } Vierkant v = new Vierkant(7.5); } v.draai();
Polymorfisme • Verschillende methodes mogen dezelfde
naam hebben als hun argumenten verschillen
• Geldt ook voor impliciete argument “this” • De meest specifieke methode die van toepassing is wordt uitgevoerd
Dynamische typering • Een variabele heeft een type • Statisch gedeclareerd Bankrekening mijnRekening;
• Een object heeft een type • Dynamisch bepaald mijnRekening = new Zichtrekening();
Overeenkomst • Type van een object moet een subklasse zijn van type van de variable
Bankrekening mijnRekening = new Bankrekening(); Bankrekening mijnRekening = new Zichtrekening(); Zichtrekening mijnRekening = new Bankrekening(); Vierkant x = new Rechthoek(); Rechthoek x = new Vierkant(); Vierkant x = new Vierkant()
Gelijkaardig voor primitieve types int a = 9.2; double a = 9;
Overeenkomst • Type van een object moet een subklasse zijn van type van de variable
Bankrekening mijnRekening = new Bankrekening(); Bankrekening mijnRekening = new Zichtrekening(); Zichtrekening mijnRekening = new Bankrekening(); Vierkant x = new Rechthoek(); Rechthoek x = new Vierkant(); Vierkant x = new Vierkant()
Gelijkaardig voor primitieve types int a = 9.2; double a = 9;
public class Rechthoek { protected double breedte; protected double hoogte; ... public boolean pastIn(Rechthoek ander) { return (this.breedte <= ander.breedte) && (this.hoogte <= ander.hoogte) || (this.breedte <= ander.hoogte) && (this.hoogte <= ander.breedte) ; } public boolean pastIn(Vierkant ander) { return (this.breedte <= ander.breedte) && (this.hoogte <= ander.breedte) ; } Vierkant x = new Vierkant(7); } Rechthoek y = new Vierkant(2); public class Vierkant extends Rechthoek { Rechthoek z = new Rechthoek(3,4); ... x.pastIn(x); public boolean pastIn(Vierkant ander) { y.pastIn(x); return (this.breedte <= ander.breedte); z.pastIn(x); } x.pastIn(y); public boolean pastIn(Rechthoek ander) { return (this.breedte <= ander.breedte) && (this.breedte <= ander.hoogte) ; } } Dynamische type Statische type
public class Rechthoek { protected double breedte; protected double hoogte; ... public boolean pastIn(Rechthoek ander) { return (this.breedte <= ander.breedte) && (this.hoogte <= ander.hoogte) || (this.breedte <= ander.hoogte) && (this.hoogte <= ander.breedte) ; } public boolean pastIn(Vierkant ander) { return (this.breedte <= ander.breedte) && (this.hoogte <= ander.breedte) ; } Vierkant x = new Vierkant(7); } Rechthoek y = new Vierkant(2); public class Vierkant extends Rechthoek { Rechthoek z = new Rechthoek(3,4); ... x.pastIn(x); public boolean pastIn(Vierkant ander) { y.pastIn(x); return (this.breedte <= ander.breedte); z.pastIn(x); } x.pastIn(y); public boolean pastIn(Rechthoek ander) { return (this.breedte <= ander.breedte) && (this.breedte <= ander.hoogte) ; } } Dynamische type Statische type
public class Rechthoek { protected double breedte; protected double hoogte; ... public boolean pastIn(Rechthoek ander) { return (this.breedte <= ander.breedte) && (this.hoogte <= ander.hoogte) || (this.breedte <= ander.hoogte) && (this.hoogte <= ander.breedte) ; } public boolean pastIn(Vierkant ander) { return (this.breedte <= ander.breedte) && (this.hoogte <= ander.breedte) ; } Vierkant x = new Vierkant(7); } Rechthoek y = new Vierkant(2); public class Vierkant extends Rechthoek { Rechthoek z = new Rechthoek(3,4); ... x.pastIn(x); public boolean pastIn(Vierkant ander) { y.pastIn(x); return (this.breedte <= ander.breedte); z.pastIn(x); } x.pastIn(y); public boolean pastIn(Rechthoek ander) { return (this.breedte <= ander.breedte) && (this.breedte <= ander.hoogte) ; } } Dynamische type Statische type
public class ComplexGetal { ... public ComplexGetal plus(ComplexGetal ander) { return new ComplexGetal(ander.getReeel() + getReeel(), ander.getImaginair() + getImaginair()); } } public class ReeelGetal extends ComplexGetal { ... public ReeelGetal plus(ReeelGetal ander) { return new ReeelGetal(ander.getReeel() + getReeel()); } } ReeelGetal r = new ReeelGetal(5.0); ReeelGetal s = new ReeelGetal(5.0); ReeelGetal som = r.plus(s);
public class ComplexGetal { ... public ComplexGetal plus(ComplexGetal ander) { double som_r = ander.getReeel() + getReeel(); double som_i = ander.getImaginair() + getImaginair(); if (som_i == 0) return new ReeelGetal(som_r); else Mag return new ComplexGetal(som_r, som_i); } } public class ReeelGetal extends ComplexGetal { ... public ReeelGetal plus(ReeelGetal ander) { return new ReeelGetal(ander.getReeel() + getReeel()); } }
dit wel?
public class ComplexGetal { ... public ComplexGetal plus(ComplexGetal ander) { double som_r = ander.getReeel() + getReeel(); double som_i = ander.getImaginair() + getImaginair(); if (som_i == 0) return new ReeelGetal(som_r); else Mag dit wel? return new ComplexGetal(som_r, som_i); } } public class ReeelGetal extends ComplexGetal { ... public ReeelGetal plus(ReeelGetal ander) { return new ReeelGetal(ander.getReeel() + getReeel()); } ComplexGetal r = new ComplexGetal(1,-1); } ComplexGetal s = new ComplexGetal(1,1); ReeelGetal som = r.plus(s);
Typecasting • Soms weten wij dat een variabele een
strenger type heeft dan de compiler kan afleiden ComplexGetal r = new ComplexGetal(1,-1); ComplexGetal s = new ComplexGetal(1,1); ReeelGetal som = (ReeelGetal) r.plus(s);
Kwis (3)
class X { public void a() { System.out.println("x"); } } class Y extends X { public void a() { System.out.println("y"); } } class Z extends Y { public void a() { System.out.println("z"); }
public static void main(String[] args) { X x = new X(); x.a(); x = new Z(); x.a(); Y y = new Z(); y.a(); y = new Y(); y.a(); } }
class Element { public class Lijst { private int waarde; private Element eerste; private Element volgende; public void voegtoe(int i) { private void setVolgende(Element v) { if (eerste != null) volgende = v; eerste.voegtoe(i); } else eerste = new Element(i); Element getVolgende() { } return volgende; public String toString() { } Element huidige = eerste; Element(int i) { String resultaat = ""; waarde = i; while (huidige != null) { } resultaat += huidige.toString(); void voegtoe(int i) { resultaat += " "; if (volgende == null) huidige = huidige.getVolgende(); setVolgende(new Element(i)); } else getVolgende().voegtoe(i); return resultaat; } } public String toString() { } return "" + waarde; }}
public class Lijst { public class Vermenigvuldigingstafel { private Element eerste; private Lijst tafel; public void voegtoe(int i) { public Vermenigvuldigingstafel(int g) { if (eerste != null) tafel = new Lijst(); eerste.voegtoe(i); for (int i = 1; i <= 10; i++) { else eerste = new Element(i); tafel.voegtoe(g*i); } } public String toString() { } Element huidige = eerste; public Lijst getTafel() { String resultaat = ""; return tafel; while (huidige != null) { } resultaat += huidige.toString(); public static void main(String[] a) { resultaat += " "; int g = Integer.parseInt(a[0]); huidige = huidige.getVolgende(); Vermenigvuldigingstafel t; } t = new Vermenigvuldigingstafel(g); return resultaat; System.out.println(t.getTafel()); } } } }
Slotbemerkingen
Het paradigma • OO is manier om over software systeem te denken
• nl., als verzameling van objecten • die elk verantwoordelijke zijn voor bepaald stuk afgeschermde functionaliteit
• die al dan niet kunnen overkomen met objecten uit de echte wereld
Belangrijke termen • Object • Klasse • Encapsulatie • Overerving • Polymorfisme