name: portada class: portada-slide, center, middle # Herència .footnote[Joan Puigcerver Ibáñez] --- layout: true class: regular-slide .right[.logo[]] --- # Exercici - ThreeRectanglesOneLeftPiramid --- # Herència - Basar una classe amb una altre classe - Classe base (o pare) - Sub classe (o filla) - Permet compartir atributs i mètodes --- # Herència - exemple
classDiagram class Person Person : +String name Person : +LocalDate birthDate Person : +int age() Person <|-- Student Student : +int startYear Person <|-- Teacher Teacher : +int salary
--- # Herència - exemple
classDiagram class Animal Animal : +move() Animal <|-- Dog Dog : +bark() Aniaml <|-- Cat Cat : +meow()
--- # Herència ## EXEMPLE INCORRECTE No confonre instanciació amb herencia
classDiagram class Person Person <|-- OnaOm Person <|-- OtPi Person <|-- YunPi
--- # Herència - definició ``` public class Student extends Person { ``` --- # Herència - constructora ### Constructora - Dins de la construtora filla s'ha de cridar la de la pare - s'usa la paraula _super_ per fer rerència a la pare ``` public Person(String name, LocalDate birthDate) { this.name = name; this.birthDate = birthDate; } ``` ``` public Student(String name, LocalDate birthDate, int startYear) { super(name, birthDate); this.startYear = startYear; } ``` --- # Herència - accés - Des d'una classe podem accedir als mètodes i variables de la pare (segons visivilitat) ``` public void definedInStudent(){ int age = super.getAge(); } ``` - Més senzill ``` public void definedInStudent(){ int age = getAge(); } ``` --- # Herència - polimorfisme - Podem tractar una classe filla com a pare ``` Student student = new Student("Mar", LocalDate.now(), 2020); student.getAge(); student.getStartYear(); Person person = new Student("Mar", LocalDate.now(), 2020); person.getAge(); // no es pot fer: person.getStartYear(); ``` --- # Herència - sobrescriptura - Podem sobreescriure un mètode de la classe pare desde la filla. ``` public class Person { // ... @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", birthDate=" + birthDate + '}'; } } } ``` --- # Herència - sobrescriptura ``` public class Student extends Person{ // ... @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", birthDate=" + birthDate + ", startYear=" + startYear + '}'; } ``` --- # Herència - sobrescriptura - Podem seguir accedint al mètode de la classe pare usant super ``` public class Teacher extends Person{ public String getName(){ return "Sr/Mr"+super.getName(); } } ``` --- # Herència múltiple - Alguns llenguatges (pocs) permeten que una classe heredi de més d'una. - Java no ho permet