Concepte d’interfície i herència múltiple en Java. Implements. Exemples i diagrames de classes. (CU00696B)

Escrit per Alex Rodríguez

Resum: Lliurament nº96 de el curs “Aprendre programació Java des de zero “.
Codificació aprenderaprogramar.com: CU00696B

CONCEPTE D’INTERFACE I HERÈNCIA MÚLTIPLE EN JAVA. Implements.

En apartats anteriors d’el tutorial hem estudiat els conceptes d’herència i polimorfisme. Fins ara hem considerat escenaris en què una classe hereta només d’una altra classe. Seria possible plantejar un escenari on una classe hereta de més d’una classe (herència múltiple)?

herència múltiple java

l’esquema de la figura anterior representaria que hagués classes com ProfesorEmerito que heretarien de dues classes: Professor i Conferenciant. Això seria un cas d’herència múltiple, i representaria que la subclasse comparteix les característiques de les dues superclasses, ia més té les seves característiques específiques pròpies. L’herència múltiple, de cara a la consistència dels programes i els llenguatges té una relativament alta complexitat. Per aquest motiu alguns llenguatges orientats a objectes la permetin i altres no. Java no permet l’herència múltiple, però a canvi disposa de la construcció anomenada “Interface” que permet una forma de simulació o implementació limitada de l’herència múltiple.

Ja hem discutit el concepte d’interfície en al·lusió a la signatura de mètodes o la informació pública de les classes. També hem fet una primera aproximació a terme interfície en Java, ia manera de símil vam dir que podia considerar-se com una norma d’urbanisme en una ciutat. Anem a aprofundir en el concepte d’interfície dins de Java. Un interfície és una construcció similar a una classe abstracta en Java, però amb les següents diferències:

a) en el encapçalat s’usa la paraula clau interfície en lloc de class o abstract class. Per exemple public interface NombreDelInterface {…}

b) Tot mètode és abstracte i públic sense necessitat de declarar-ho, és a dir, no cal posar abstract public per que per defecte tots els mètodes són abstract public. Per tant un interfície en Java no implementa cap dels mètodes que declara: cap dels seus mètodes té cos.

c) Les interfícies no tenen cap constructor.

d) Un interfície només admet camps de tipus “public static final”, és a dir, camps de classe, públics i constants. No cal incloure les paraules public static final perquè tots els camps seran tractats com si portessin aquestes paraules. Recordem que static equivalia a “de classe” i final a “constant”. Les interfícies poden ser un lloc interessant per declarar constants que van a ser usades per diferents classes en els nostres programes.

e) Una classe pot derivar d’un interfície de la mateixa manera en què pot derivar d’una altra classe. No obstant això, es diu que la interfície s’implementa (implements), no s’estén (extends) per les seves subclasses. per tant per declarar l’herència d’un interfície es fa servir la paraula clau implem ents en lloc de extends.

Una classe pot implementar un o diversos interfícies en Java (s’indica amb implements NombreInterface1, NombreInterface2, … etc.), però només pot estendre una classe. Implementar diversos interfícies en una sola classe és el més semblant que té Java a l’herència múltiple.

Podem declarar variables de l’tipus interfície, però per inicialitzar utilitzarem una classe concreta que el implementi. Per exemple List < String > miLista; declara una variable amb el tipus de la interfície List. La inicialització miLista = new List < String > (); no és possible perquè no es pot crear un objecte de l’tipus definit per una interfície. En canvi miLista = new LinkedList < String > (); si és vàlid.

Direm que una interfície en Java defineix un tipus els mètodes estan tots sense implementar i que resulta equivalent a una herència múltiple (de classes abstractes) en una classe.Si una classe implementa una interfície, pot succeir:

a) Que implementi els mètodes de la interfície sobreescribiéndolos (pot ser una classe concreta).

b) Que no implementi els mètodes de la interfície: obligatòriament serà una classe abstracta i obligatòriament ha de portar la paraula clau abstract en el seu encapçalat per així indicar-ho.

Considerem un diagrama de classes com aquest, que podria emprar-se per un programa de gestió en un centre educatiu:

interfície java

Veiem que les interfícies són identificades per BlueJ amb < < interfície > > a la part superior de la seva icona. Dins d’aquestes classes les relacions queden determinades per aquest codi:

a

public interface Actor {…}: defineix la interfície actor exemple aprenderaprogramar.com.

public abstract class Persona implements Actor {…}: defineix la classe abstracta Persona com implementació de la interfície Actor.

public class Professor extends Persona {…}: defineix la classe Professor com extensió de la classe Persona.

public class Estudiant extends Persona {…}: defineix la classe Estudiant com a extensió de la classe Persona.

public interface ObjetoInerte {…}: defineix la interfície ObjetoInerte.

public class vehicle implements Actor, ObjetoInerte {…}: defineix que la classe vehicle implementa a dues interfícies, la interfície Actor i la interfície ObjetoInerte, és a dir, que un vehicle és alhora Actor i ObjetoInerte.

public class Cotxe extends Vehicle {…}: defineix la classe Cotxe com a extensió de la classe Vehicle.

public class Bicicleta extensió ds Vehicle {…}: defineix la classe Bicicleta com a extensió de la classe Vehicle.

Una classe podria heretar d’una altra i implementar una o diverses interfícies. En aquest cas en primer lloc es posa la relació d’herència respecte a la superclasse i tot seguit les interfícies que implementa. Per exemple en aquest esquema:

interfície java

la definició de la classe Arbre seria així: public class Arbre extends Vegetal implements Actor {…}. La classe hereta de Vegetal i implementa a Actor.

Com saber si una classe és candidata a ser definida com una interfície?

a) Si necessitem algun mètode amb cos ja sabem que no serà una interfície perquè tots els mètodes d’una interfície han de ser abstractes.

b) Si necessitem que una classe “hereti” de més d’una superclasse, aquestes superclasses són candidates a ser interfícies.

c) En alguns casos és igual de viable definir una classe com a interfície que com a classe abstracta, però posats en aquesta situació preferirem optar per una interfície perquè és més flexible i extensible: ens va a permetre que una classe implementi diverses interfícies (aprofitem l’herència múltiple de les interfícies). en canvi , una classe no pot heretar de diverses classes.

Recordar que els camp s declarats són camps estàtics encara que no s’indiqui específicament:

a

public interface Actor {

int actiu = 1;

int inactiu = 0;

// … resta de el codi de la interfície exemple aprenderaprogramar.com

}

a

En aquest cas actiu i inactiu es comporten com public static final (constants) per a totes les classes que implementin aquesta interfície.

Quin és un dels interessos principals d’usar interfícies? Poder fer ús del polimorfisme: per exemple poder reunir en una col·lecció objectes de l’tipus interfície però que estan implementats en diferents classes. O poder tractar en un bucle objectes de diferents tipus però que pertanyen a la mateixa Supertipo perquè implementen una interfície.

EXERCICI

Respon a les següents preguntes:

a ) Una classe pot heretar de dues classes en Java?

b) Una interfície Java pot tenir mètodes que incloguin una sentència while?Una interfície Java pot tenir mètodes que incloguin una sentència System.out.println?

c) Un objecte Java pot ser de l’tipus definit per una interfície? ¿Un objecte Java pot ser a el mateix temps de l’tipus definit per una interfície i de l’tipus definit per una classe que no implementa la interfície? ¿Un objecte Java pot ser a el mateix temps de l’tipus definit per una interfície i de l’tipus definit per una classe que implementa la interfície?

Per comprovar si les teves respostes són correctes pots consultar als fòrums aprenderaprogramar.com.

Per accedir a la informació general sobre aquest curs i a la llista completa de lliuraments prem en aquest link: Veure curs complet.

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *