Interfata (interface)
Definitie
Interfata reprezinta un mecanism prin care o clasa C
utilizeaza date si servicii oferite de instante ale unor clase A1,
A2,.
. ., An, in mod independent de acestea, accesand clasele
Ai
prin intermediul unei interfete.
Sa presupunem ca trebuie scrisa o aplicatie de gestiune
a activitatii unui agent comercial de aprovizionare cu bunuri de consum.
Programul va necesita informatii in legatura cu entitati ca: furnizori,
companii de transport, depozite etc. Este foarte probabil ca modelarea
acestor entitati sa se realizeze cu ajutorul cate unei clase distincte,
specifice (ele vor corespunde claselor Ai din definitie).
Exista insa cel putin un element comun care le caracterizeaza: adresa postala.
Deoarece adresele apar in mai multe parti ale interfetei utilizator, avem
nevoie de o clasa care sa permita editarea si afisarea adreselor, dar care
sa poata fi reutilizata ori de cate ori avem de a face cu adrese. Fie AddressPanel
numele acestei clase (corespondenta clasei C din definitie).
AddressPanel trebuie sa poata regasi si
seta informatia de adresa in obiecte diferite (pe care le vom denumi cu
un nume generic DataClass), fara a fi afectata de aceasta
diversitate.
Daca implementarea se va face in C++, care permite mostenirea
multipla, problema se poate rezolva impunand ca obiectele DataClass
sa derive (pe langa eventuale alte superclase) si dintr-o clasa AddressIF,
care sa joace rol de intermediar. AddressIF poate fi o clasa
abstracta.
Daca limbajul folosit pentru implementare este Java,
care nu admite mostenire multipla, AddressIF va trebui sa
fi o interfata, iar obiectele DataClass vor implementa aceasta
interfata:
Motivatii
Solutie
Pentru a evita cuplajul intre clase rezultat prin faptul
ca unele le utilizeaza pe altele, practic se indirecteaza utilizarea, plasand
o interfata intre clasele "client" si cele "server":
Consecinte
Aplicand sablonul Interfata se previne cuplarea unei clase
care are nevoie de un serviciu, de o clasa care ofera acel serviciu. Ca
orice indirectare, insa, Interface poate face ca un program sa fie mai
putin clar.
Implementare
Se defineste o interfata (interface in Java
sau clasa abstracta in C++) in care se declara operatiile corespunzatoare
serviciilor necesare. Clasele client vor contine o referinta la interfata,
iar clasele server vor implementa interfata (implements in
Java, respectiv derivate public din clasa abstracta in C++).
Considerand exemplul din paragraful "Context",
putem scrie:
// varianta Java
public interface AddressIF { public String getAddr( ); public void setAddr( String addr); public String getCity( ); public void setCity(String city); } public class AddressPanel { private AddressIF obServer; public void save( ) { if (obServer != null ) { obServer.setAddress(getText( )); obServer.setCity(getText( )); } } //. . . } public class Furnizor implements AddressIF { // clasa Furnizor poate eventual sa si extinda o anumita superclasa, daca e cazul private String addr; private String city; public String getAddr( ) { return addr; } public void setAddr( String addr) { this.addr = addr; } //. . . } |
// varianta C++
class AddressIF { public: String getAddr( ) = 0; void setAddress(String) = 0; String getCity( ) = 0; void setCity(String) = 0; }; class AddressPanel { private: AddressIF *obServer; public: void save( ) { if (obServer != 0 ) { obServer -> setAddress(getText( )); obServer -> setCity(getText( )); } } //. . . }; class Furnizor : public AddressIF { // clasa Furnizor poate eventual sa derive si din alte superclase, daca e cazul private: String addr; String city; public: String getAddr( ) { return addr; } void setAddr( String addr) { this -> addr = addr; } //. . . }; |
Tema
Se cere sa se realizeze: