Sunteți pe pagina 1din 10

Interfet, e

2016

ndrumtor pentru laborator

Interfet, e

Scopul lucrrii

Obiectivele de nvt, are ale acestei lucrri sunt

nt, elegerea conceptului de interfat, s, i a diferent, elor fat, de mos, tenire


Acumularea de experient, de programare n implementare interfet, elor existente s, i n denirea s, i implementarea celor denite de ctre programator

Ce este o interfat,

2.1 Denitie si caracteristici


,

O interfat, a este o list de metode care trebuie denite de ctre orice clasa care implementeaz
interfat, a respectiv. O interfat, a poate deni i constante (public static nal).

Seamn cu o clasa abstract.

O interfat, a este asemntoare cu o clas abstract care nu

are variabile instant, i statice (constantele static nal sunt permise), i fr corpuri pentru
metode.

Aceasta este n esent, a ceea ce face o clas complet abstract, dar clasele abstracte

permit denit, ii de metode statice, pe cnd interfet, ele nu permit acest lucru.

Obligat, ie contractual.

Atunci cnd o clas specica faptul c ea implementeaz o interfat, ,

clasa trebuie s deneasc toate metodele respectivei interfet, e. O clas poate implementa mai
multe interfet, e diferite.

Daca o clas nu denete toate metodele interfet, elor pe care a fost

implements), compilatorul d un mesaj de eroare, care


"This class must be declared abstract". (O clas abstract este

de acord s le deneasc(prin clauza


tipic spune ceva de genul

una care nu implementeaz toate metodele pe care le-a declarat.) Solut, ia pentru eroare este
aproape ntotdeauna s se implementeze metodele lips dininterfat, . Un nume de metod scris
greit sau o lista incorecta de parametri este cauza uzual, nu faptulc respectiva clas ar 
trebuit s e abstract!
O utilizare foarte frecvent a interfet, elor este pentru asculttori (listeners). Un asculttor
(listener) este un obiect dintr-o clas care implementeaz metodele cerute pentru interfat, a
respectiv.

Putet, i crea asculttori interiori (inner) anonimi sau putet, i implementa interfat, a

ceruta n oricare clas. Interfet, ele sunt de asemenea folosite extensiv n pachetul de structuri
de date (Java Collections).

2.2 Clasele n comparatie cu interfetele


,

Clasele sunt folosite pentru a reprezenta ceva care are

/ responsabilitt, i (metode, functii).


Interfet, ele descriu doar capabilitt, i.

atribute (variabile, cmpuri) i capabilitt, i

Spre exemplu, suntem oameni pentru c avem atribu-

tele unui om (clas). Cineva este instalator pentru ca are abilitatea unui instalator (interfat, ).
Cineva poate  ielectrician (interfat, ). Putet, i implementa multe interfet, e, dar obiectele pot
 de o singur clas.
Aceast analogie nu merge, totui, ntr-un anume sens.

Capabilitt, ile (metodele) unei clase

nu se schimb (dac oclas implementeaz o interfat, , ea este implementat pentru toate

U.T. Cluj-Napoca

Programare orientat pe obiecte

ndrumtor pentru laborator

Interfet, e

instant, ele), pe cnd ndemnrile omeneti despre care vorbeam sunt dinamice i pot  nvt, ate
sau uitate. Analogia are un defect, cum sunt toate analogiile de altfel, dar ofer o idee despre
cum se poate face o distinct, ie ntre clase i interfet, e.

Interfet, ele nlocuiesc motenirea multipl.


o clasa printe.

O clasa din C++ poate avea mai mult de

Aceasta se numete motenire multipl.

Gestionarea denit, iilor variabilelor

instant, n cazul motenirii multiple poate deveni destul de ncurcat i duce la mai multe
probleme  d.e., aa numitul "Diamant ucigtor al mort, ii" ("Deadly Diamond of Death") 
dect solut, ii. Figura din stnga constituie o ilustrare a problemei ment, ionate. n gur sunt
prezentate patru clase aranjate ntr-o structur care creeaz nevoia motenirii virtuale. Att
clasa B ct i clasa C motenesc din clasa A. D motenete multiplu att din B ct i din C. De
aici apar doua probleme. Prima: ce implementare a metodei 'f ' s moteneasc D? Ar trebui
sa moteneasc f() din B sau f() din C? n C++ rspunsul se dovedete a  nici una. Trebuie
declarat f() n D i trebuie implementat. Aceasta elimina ambiguitatea i cu sigurant, a aceasta
regul simpl ar  putut  adoptat n Java.
Totui, cea de a doua problem este un pic mai complicat. Clasa A are o variabila membru
numit i. Amndou clasele B i C motenesc aceasta variabila membru. Cum D o motenete
de la amndou, avem de-a face cu o ambiguitate. Pe de o parte am dori ca i din B i i din C
s e variabile separate n D, crend astfel dou copii ale lui A n D. Pe de alt parte am dori
s existe o singur copie a lui A n D astfel ca numai un i din A s existe n D.
Din acest motiv proiectant, ii limbajului Java au ales s permit doar o singura clas printe,
dar multiple interfet, e. Aceasta furnizeaz majoritatea funct, ionalitt, ii motenirii multiple, dar
fr dicultt, ile pe care le incumb.

Figura 1: Deadly Diamond of Death

U.T. Cluj-Napoca

Programare orientat pe obiecte

ndrumtor pentru laborator

Interfet, e

2.3 Denirea si implementarea unei interfete


2.3.1
1
2
3
4

Sintaxa

[ modificator acces ] interface NumeInterfata {


// constante
public static final X = 10;
int Y = 20; // pare o variabila instanta , dar este o
constanta
// implicit este declarata cu modificatorii public static
final

public void numeMetoda () ;

7
8

2.3.2
1
2
3
4
5

Implementarea unei interfete

class NumeClasa implements NumeInterfata {


public void numeMetoda () {
// codul necesar pentru implementarea metodei
}
}

2.3.3

Instantiearea unei interfete

La fel ca si in cazul claselor abstracte, o interfata nu poate  instantiata.

Prin denitie, o

interfata nu poate avea constructori. DAR, putem declara o variabila de tipul NumeInterfata si
o putem instantia cu orice clasa concreta care implementeaza interfata respectiva. De exemplu:
1

NumeInterfata v = new NumeClasa () ;


Acest fel de instantiere a unei variabile de un anumit tip cu o instanta de alt tip produce

polimorfismul.

Interfetele Java sunt o modalitate de a obtine polimormism. Tipul obiectului

in cazul nostru este o interfata, dar in general poate  atat o clasa cat si o interfata.

U.T. Cluj-Napoca

Programare orientat pe obiecte

ndrumtor pentru laborator

2.3.4

Interfet, e

Extinderea unei interfete prin mostenire

Interfetele se pot extinde prin mostenire. Un exemplu in acest sens:


1
2
3
4
5
6

// Filename : Sports . java


public interface Sports
{
public void setHomeTeam ( String name );
public void setVisitingTeam ( String name );
}

7
8
9
10
11
12
13
14

// Filename : Football . java


public interface Football extends Sports
{
public void homeTeamScored ( int points );
public void visitingTeamScored ( int points );
public void endOfQuarter ( int quarter );
}

15
16
17
18
19
20
21
22
23

// Filename : Hockey . java


public interface Hockey extends Sports
{
public void homeGoalScored () ;
public void visitingGoalScored () ;
public void endOfPeriod ( int period );
public void overtimePeriod ( int ot );
}

U.T. Cluj-Napoca

Programare orientat pe obiecte

ndrumtor pentru laborator

2.3.5

Interfet, e

O clasa poate implementa oricate interfete

Exemplu de implementare a mai multe interfete predenite


Se pot implementa oricte interfet, e ntr-o clas; cele pe care dorit, i s le implementat, i le separat, i
n clauza implements cu virgule. Spre exemplu:
1
2

5
6
7
8
9
10
11
12
13
14
15

// Nota :
// ActionListener are nevoie sa fie definita metoda
actionPerformed (..)
// MouseMotionListener are nevoie de definirea lui mouseMoved (..)
si mouseDragged (..) .
public class MyPanel extends JPanel implements ActionListener ,
MouseMotionListener {
public void actionPerformed ( ActionEvent e) {
/* Corpul metodei */
}
public void mouseDragged ( MouseEvent me ) {
/* Corpul metodei */
}
public void mouseMoved ( MouseEvent me ) {
/* Corpul metodei */
}
// Tot ce mai este in aceasta clasa .
}
Este obinuit ca un panou (panel) care folosete graca i rspunde la mouse s-i implementeze
asculttori pentru mouse proprii (dar nu asculttori pentru act, iuni  action listeners) ca mai
sus.

Exemplu de declararea a unei interfet, e predenite


Pentru programe simple este mai probabil s folosit, i o interfat, dect s o denit, i. Iat cam
ce cont, ine denit, ia interfet, ei
1
2
3

java.awt.event.ActionListener.

public interface ActionListener {


public void actionPerformed ( ActionEvent e);
}

U.T. Cluj-Napoca

Programare orientat pe obiecte

ndrumtor pentru laborator

Interfet, e

2.4 Cteva interfete Java predenite


,

2.4.1

Interfat, a Clonable

Interfat, a Cloneable este un exemplu de interfat, a Java predenit:

Nu cont, ine antete de metod sau constante

Se folosete pentru a indica n ce mod trebuie folosit i redenit metoda clone (motenit
din clasa

Object)

Metoda

Dac toate datele sunt tipuri primitive sau clase care nu se schimb (cum este

Object.clone()

face o copie bit-cu-bit a datelor obiectului

String),

atunci acest lucru este adecvat.

Dac datele din obiectul de clonat include variabile instant, al cror tip este mutabil,
atunci simpla implementare a lui clone poate cauza o scurgere de informat, ii private (privacy leak)

La implementarea interfet, ei

Cloneable

pentru o clas procedat, i astfel:

Invocat, i mai nti metoda clone a obiectului din clasa de baz

Object

(sau ce alt

clas va extinde)

Apoi resetat, i valorile pentru orice alte variabile instant, noi ale cror valori sunt
tipuri de clase mutabile. Aceasta se face prin copierea variabilelor instant, a apelnd
metodele clone proprii

 Observat, i c aceasta va funct, iona corect doar dac interfat, a

Cloneable

este im-

plementat corespunztor pentru clasele de care apart, in variabilele instant, respective i pentru clasele de care apart, in oricare dintre variabilele instant, a din clasele
ment, ionate i aa mai departe

2.4.2

Interfat, a Comparable
Interfat, a Comparable este denita in pachetul

java.lang,

ind automat disponibil e-

crui program. Nu are dect urmtoarea metoda care trebuie implementat:

public int compareTo ( Object other );

Este responsabilitatea programatorului s urmeze semantica interfet, ei

Comparable atunci

cnd implementeaz. Metoda compareTo trebuie s returneze





Un numr negativ atunci cnd un obiect "este nainte de" parametrul


Zero atunci cnd obiectul apelant "este egal cu" parametrul

other

Un numr pozitiv dac obiectul apelant "urmeaz dup" parametrul

U.T. Cluj-Napoca

Programare orientat pe obiecte

other

other

ndrumtor pentru laborator

Interfet, e

Dac parametrul other nu este de acelai tip cu clasa n curs de denire, atunci trebuie
aruncat except, ie de tipul

ClassCastException

Aproape orice not, iune rezonabil de "este nainte de" este acceptabil

In particular, toate relat, iile standard mai-mic-dect peste numere i ordonrile lexicograce peste irurile de caractere sunt potrivite

Relat, ia "urmeaz dup" este doar inversul lui "este nainte de"

Pot  luate n considerare alte ordonri, atta vreme ct sunt relat, ii de ordine total. O
ordine total trebuie s satisfac urmtoarele condit, ii:




( Antireexivitate ) Pentru nici un obiect

o1

este egal cu

2.4.3

este nainte de

o1 i o2, una i numai una


o2, o1 urmeaz dup o2, sau

o1

este nainte de

o2

o2

este nainte de

o3,

atunci

o1

este

compareTo

ar trebui s coincid cu cea a metodei

dac se poate, dar aceasta nu este absolut necesar

Observat, ie: att clasa




o1

o3

Semantica lui "equals" din metoda

equals

o2

( Tranzitivitate ) Dac
nainte de

nu este naintea lui

( Trihotomi-antisimetrie ) Pentru oricare dou obiecte


dintre urmtoarele este adevrat:

o, o

Double

ct i clasa

String

implementez interfat, a

Comparable

Interfet, ele se aplic doar claselor


Un tip primitiv (d.e.,

double)

nu poate implementa o interfat,

Interfat, a Enumeration

Un obiect care implementeaz interfat, a

Enumeration

genereaz o serie de elemente, cte unul

o dat, adic reprezint

un iterator

apelurile succesive la metoda

hasMoreElements()

nextElement()

returneaz elementele succesive ale seriei

testeaz dac enumerarea respectiv mai cont, ine elemente.

Spre exemplu, pentru a tipri toate elementele unui vector


1
2
3

for ( Enumeration e=v. elements () ; e. hasMoreElements () ;) {


System . out . println (e. nextElement () );
}

U.T. Cluj-Napoca

Programare orientat pe obiecte

ndrumtor pentru laborator

2.4.4

Interfet, e

Un exemplu pentru Cloneable i Comparable

Vezi exemplul

Employee prezentat la curs.

abstract class Employee implements Comparable {


// instance variables
private String name ;
public Employee ( String name )
{
this . name = name ;
}
public String getName ()
{
return name ;
}
public int compareTo ( Object other )
{
Employee e = ( Employee ) other ;
return name . compareTo (e. name );
}
public abstract double calculatePay () ;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Mersul lucrrii
1. Studiat, i materialul i exemplele furnizate.

Numeric care s contin operatii de adunare, scdere, nmultire, nmultire


cu scalar. Creati apoi urmtoarele clase care s implementeze interfata Numeric: NumarComplex
, NumarFractionar.

2. Creat, i o interfat,

MatriceGenerica care poate s aib elemente de oricare din


(NumarComplex, NumarFractionar). n clasa matrice implementati

Implementat, i s, i o clas
cele trei dou tipuri

operat, iile de adunare, scadere s, i nmultire cu scalar.


Testat, i funct, ionalitatea claselor ntr-o funct, ie

main.

3. Rezolvati problema de sah din laboratorul precedent denind

PiesaSah

ca interfata in

loc de clasa abstracta. Care dintre cele doua variante este mai ecienta in cazul acestei
probleme si de ce?
4. Extindeti problema cu s, ahul s, i adugati codul necesar pentru a putea compara doua piese
de sah.
Indicatii de implementare:

numePiesa (ex. Pion1, Pion2, Rege etc.), adaugati ca variabila instant


String culoare care poate avea valorile alb sau negru.

Pe langa
un

U.T. Cluj-Napoca

Programare orientat pe obiecte

ndrumtor pentru laborator

Interfet, e

Folositi interfata predenita Comparable


5. Creati o clasa Persoana care sa contina nume, prenume, varsta. Intr-o functie main creati
un tablou de obiecte de tip Persoana. Ordonati vectorul in functie de nume.
Indicatii implemenatre:

Folosit functia

sort(...)

Implementati interfata

din clasa predenita

Comparable

in clasa

Arrays

Persoana

pentru a specica criteriul de

sortare

Modicati continutul functiei

compareTo(Object other)

pentru a putea sorta vec-

torul de persoane in functie de varsta

U.T. Cluj-Napoca

Programare orientat pe obiecte

10

S-ar putea să vă placă și