Professional Documents
Culture Documents
Lab1 ED2023 24-2
Lab1 ED2023 24-2
Apunts Laboratori 1:
Abstracció, herència, interfícies
Grau d’Enginyeria Informàtica · Curs 2023-2024
Escola Tècnica Superior d’Enginyeria
Universitat Rovira i Virgili
Abstracció
Abstracció: un nou recurs per millorar el disseny de software
PRINCIPI BÀSIC
abstracte / -a
L’objectiu principal és poder modelar estructures complexes mentre
Dit de tota noció considerada d'una manera més o menys general i amaguem els detalls a l’usuari. L’usuari de la nostra classe abstracta
separadament de les representacions en les quals és donada. sabrà què fa la classe però no sabrà com està implementat. Exemple:
classe “Porta”
ESPECIFICACIÓ // Atributs
estat = {obert, tancat}
// Mètodes
porta obrir()
tancar()
Obertura que es fa en una paret per permet entrar i sortir i que pot estar
oberta o tancada
L’herència és el procés pel qual una classe adquireix les propietats (atributs) i les
funcionalitats (mètodes) d’una altra classe.
Per què hauríem de voler que una classe hereti els mètodes i propietats d’una altra? Per què
classe “Porta”
estan relacionades d’alguna manera i no volem tornar a escriure el codi, cosa que generaria codi
// Atributs
duplicat i qualsevol canvi que haguéssim de fer al codi suposaria haver-ho de canviar a més d’un lloc.
estat = {obert, tancat}
Classe “Base” / “Parent class” / “Superclass”: // Mètodes
La classe que defineix les propietats i funcionalitats compartides per tots els objectes de la mateixa obrir()
classe. tancar()
Classe “Derivada” / “Classe filla” / “Subclasse”:
És la classe que hereda les propietats i els mètodes de la classe Base, en pot afegir de nous,
sobreescriure (override) o completar (accés mitjançant super) els mètodes de la classe Base.
classe “PortaEntrada”
Modificadors d’accés als mètodes // Atributs
estat = {obert, tancat, tancatAmbClau}
// Mètodes
obrir()
tancar()
tancarAmbClau()
Herència Classes Interfícies
abstractes
Herència
Com heredem en Java… Menys abstracte Més abstracte
//Atributs addicionals
private String carrera;
public class Persona {
public Estudiant(String nom, String carrera) {
super(nom);
// Atributs
this.carrera=carrera;
private String nom;
}
Persona
Persona
Estudiant
No Viable:
Si EstudiantTreballador hereta d’Estudiant i de Treballador,
què hauria de passar si crido al mètode saludar() ?
Una classe abstracta és una classe incomplerta que té mètodes abstractes. Mètode declarat
Un mètode abstracte és un mètode que està declarat però encara no definit. És a dir, és
un mètode que té signatura (sabem quins paràmetres accepta i què retorna) però no té public int ferOperacio(int x, int y);
cos.
Mètode declarat i definit
Per quin motiu ens hauria d’interessar tenir mètodes declarats però no definits?
public int ferOperacio(int x, int y){
Quan fem servir herència, a vegades volem forçar que una classe derivada implementi un mètode, return (x+y*2);
però aquest mètode pot no tenir sentit en la classe Base. }
public class Ovella extends Animal { public class Gat extends Animal {
// Atributs ... // Atributs ...
// Mètodes // Mètodes
public class Ovella extends Animal { public class Gat extends Animal {
// Atributs ... // Atributs ...
// Mètodes // Mètodes
Característiques
La paraula clau “abstract” només es pot aplicar a classes i mètodes non-static.
Una classe pot ser declarada abstracta i no tenir cap mètode abstracte dins.
Una classe abstracta no es pot instanciar (perquè està
Si la classe té com a mínim un mètode abstracte, s’ha de declarar com abstract per
incompleta i no es podria garantir el funcionament de tots
força.
els seus mètodes).
Una classe que hereti d’una classe abstracta, o bé:
public abstract class Animal { a) Implementa tots els mètodes de la classe pare abstracta
... b) Es declara com abstracta
} En una classe abstracta que hereti d’una altra els mètodes poden canviar de modificador
Animal a = new Animal();
d’accés sempre que aquest sigui menys restrictiu.
• Els mètodes d’una interfície són tots per definició, public i abstract.
• Els atributs d’una interfície són tots, per definició, public, static i final.
Es poden accedir, però no modificar.
Interfícies
Sintaxi en Java
• Una interfície pot ser: • Al ser interpretat com un contracte de funcionament, una classe pot
A. Implementada per una classe (com en l’exemple anterior) implementar diverses interfícies
Es diu que una classe “implementa” una interfície si class AnimalRobot implements Animal, Robot { ... }
defineix un codi per tots i cadascun dels mètodes que
es declaren en aquella interfície.
A més, també en pot definir més.
• Una classe pot implementar diverses interfícies i heretar d’una altra classe
B. “Extended” per una altra interfície. class Ovella implements Animal { ... }
Diferències conceptuals