Un obiect include date ti metode (operatii) care permit modificarea datelor. Obiectul executa o operatie atunci cand primette o cerere (un mesaj) de la un client. Mesajele reprezinta singura cale prin care un obiect este determinat sa execute o operatie, iar operatiile sunt singurul mod de a modifica datele interne ale obiectului. Din cauza acestor restrictii, starea interna a obiectului se spune ca este încapsulata: ea nu poate fi accesata direct, iar reprezentarea ei este invizibila dinspre exteriorul obiectului. Pentru fiecare operatie declarata într-un obiect se precizeaza numele, parametrii ti valoarea returnata. Aceste elemente formeaza semnatura operatiei.

Multimea tuturor semnaturilor corespunzatoare operatiilor dintr-un obiect, accesibile clientilor, reprezinta interfata obiectului. Aceasta descrie complet setul mesajelor care pot fi trimise spre obiectul respectiv. Un tip este un nume utilizat pentru a referi o anumita interfata. Un obiect este de tipul T daca el accepta toate mesajele corespunzatoare operatiilor definite în interfata numita T. Interfetele sunt elemente fundamentale în sistemele OO. Obiectele sunt cunoscute doar prin intermediul interfetelor lor. O interfata nu da nici un detaliu relativ la implementarea unui obiect, iar obiecte distincte pot implementa diferit o aceeati cerere.

Interfete Java

Interfetele Java reprezinta o colectie de metode abstracte (doar semnatura, nu ti implementarea acestora) ti de constante. Utilizarea unei interfete este justificata în cazurile în care se dorette ca o clasa sa poata fi convertita în mai multe tipuri de baza între care nu exista relatie de mottenire. Deoarece Java nu suporta mottenirea multipla, interfetele reprezinta o varianta de rezolvare a acestei situatii. La fel ca ti o clasa, înainte de a putea utiliza o interfata ea trebuie declarata. Deoarece contine metode abstracte, interfata nu poate fi instantiata. Cu toate acestea, o variabila poate fi declarata ca fiind de tipul interfetei.

Declararea unei interfete în Java

O interfata Java este declarata prin cuvantul cheie interface. Structura generala a declaratiei unei interfete este:

[modificator] interface id_interfata [extends lista_de_interfete]

{

lista_de_metode;

lista_de_constante;

}

Modificatorul unei interfete poate fi public sau abstract. Avand în vedere faptul ca o interfata este abstracta prin definitie, utilizarea modificatorului abstract este redundanta. Spre deosebire de o clasa, o interfata poate motteni mai multe interfete. Mottenirea se face prin clauza extends urmata de lista interfetelor mottenite (lista_de _interfete) separate prin virgula. Prin derivare, o interfata mottenette de la interfata de baza atat metodele, cat ti constantele acesteia.

public interface Id1 extends Id2, Id3, Id4

În corpul interfetei pot exista o lista de declaratii de metode ti o lista de declaratii de constante. Metodele declarate într-o interfata sunt implicit abstracte. Constantele declarate în interfata primesc atributele static ti final. Unui camp final, dupa ce a fost initializat, nu i se mai poate modifica valoarea.

public interface Alergator
{
    int lg_pista=1000;
    int timp_max=3;
    public void alearga();
    public void accelerează();
}

Metodele dintr-o interfata nu pot fi statice. Referirea constantelor se va face astfel:

Alergator.lg_pista;

În urma compilarii unui fitier sursa Java care contine o interfata, va rezulta un fitier cu extensia .class atatat interfetei respective.

Utilizarea interfetelor

Interfetele Java pot fi utilizate în declaratia unei clase, obligand clasa respectiva sa implementeze metodele declarate în interfata. În Java, acest lucru e realizat prin folosirea cuvantului cheie implements:

class Sportiv extends Om implements Alergator, Saritor
{
   //implementarea metodelor din interfaţa Alergator;
   //implementarea metodelor din interfaţa Saritor;
}

Ata cum se poate observa, o clasa poate implementa mai multe interfete. Daca o clasa care implementeaza o interfata nu implementeaza toate metodele declarate în interfata respectiva, va trebui sa fie declarata abstracta, altfel se va semnala eroare la compilare. Daca o clasa A implementeaza o interfata X, un obiect al clasei A este de tip X, el putand sa fie atribuit unui 3 alt obiect de tip X. Numele unei interfete poate fi utilizat la fel ca ti numele unui clase, mai putin la instantierea prin operatorul new

Exemplu de lucru cu interfete

interface Cititor
{
    public void citeste();
}
interface Scriitor
{
    public void scrie();
}
interface Profesor extends Cititor, Scriitor
{
    int nota_max=10;
    int nota_medie=5;
    int nota_min=1;
    public void apreciere();
}
interface Scufundator
{
    int h=10;
    public void scufundare();
}
class Inotator implements Scufundator
{
    static final int l=50;
    public void inot()
    {
        System.out.println("Inoata " + l + "metri ");
    }
    public void scufundare()
    {
        System.out.println("Scufunda " + h + "metri ");
    }
}
class ProfesorInot extends Inotator implements Profesor
{
    public void citeste()
    {
        System.out.println("Citeste PRO Sport ");
    }
    public void scrie()
    {
        System.out.println("Nu scrie nimic!");
    }
    public void apreciere()
    {
        System.out.println("Slab. Primeşti nota " +
                nota_medie);
    }
}
class ProfesorJava implements Profesor
{
    public void citeste()
    {
        System.out.println("Citeste Thinking in Java");
    }
    public void scrie()
    {
        System.out.println("Scrie programe Java");
    }
    public void apreciere()
    {
        System.out.println("Excelent. Primeşti nota " +
                nota_max);
    }
}
public class TestInterfata
{
    public static void main(String [] args)
    {
        ProfesorInot pi = new ProfesorInot();
        ProfesorJava pj = new ProfesorJava();
        ceCiteste(pi); ceScrie(pi);
        ceCiteste(pj); ceScrie(pj);
        cumApreciaza(pi); cumApreciaza(pj);
        pi.inot(); pi.scufundare(); //corect
        pj.inot(); pj.scufundare(); //incorect
    }
    public static void ceCiteste( Cititor c)
    {
        c.citeste();
    }
    public static void ceScrie( Scriitor s)
    {
        s.scrie();
    }
    public static void cumApreciaza( Profesor p)
    {
        p.apreciere();
    }
}

Java Pentru a mai buna întelegere a conceptelor prezentate în lucrare, vom recurge, în continuare, la un exemplu.

Folosind referinta de interfata se pot apela metodele enumerate în interfata, iar ceea ce se executa va fi codul corespunzator clasei "implementatoare", la care apartine obiectul concret indicat de referinta

Asocierea operatiilor cu obiectele

Cand o cerere este trimisa unui obiect, operatia care se va executa depinde de:

  • cerere;

  • obiectul care receptioneaza cererea.

Obiecte diferite, care pot receptiona cereri identice, pot avea implementari diferite ale operatiilor care vor satisface cererile respective. Practic, prin cerere se identifica serviciul dorit, iar prin obiectul receptor se alege o anume implementare a acelui serviciu. Asocierea dintre o operatie solicitata ti obiectul care va pune la dispozitie implementarea concreta a operatiei se numette legare (binding). În functie de momentul în care ea se realizeaza, legarea poate fi:

  • statica: asocierea se realizeaza la compilare;

  • dinamica: asocierea se realizeaza la executie.

În programele Java, majoritatea apelurilor de metode presupun legare dinamica. Asocierea dinamica permite scrierea de programe în care:

  • la emiterea unei cereri sa nu ne preocupe ce obiect o va receptiona, stiindu-se ca orice obiect a carui interfata include o semnatura potrivita va fi bun;

  • obiecte avand interfete identice pot fi substituite unul altuia, la executie; aceasta substituire se mai numette polimorfism.

Tema

Se cere sa se modeleze activitatea unui ghiteu bancar.

Sistemul este format din urmatoarele entitati, cu atributele corespunzatoare:

Banca

  • clienti (tablou de elemente de tip Client)

  • codBanca (sir de caractere)

ContBancar

  • numarCont (String)

  • suma(float)

Client

  • nume (String)

  • adresa (String)

  • conturi (tablou de elemente de tip ContBancar; un client trebuie sa aiba cel putin un cont, dar nu mai mult de cinci conturi)

Conturile bancare pot fi în RON ti în EUR. Pentru conturile in RON, dobanda se calculeaza astfel: 0,3 RON pe zi pentru sume sub 500 RON si 0,8 RON pe zi pentru sume mai mari.

Conturile in EUR au o dobanda de 0,1 EUR pe zi. Operatiunile posibile asupra unui cont sunt depunere sau extragere a unei sume specificate. Transferuri se pot efectua doar intre conturile in RON.

public void transfer(ContBancar contDest, float suma) .

Toate conturile implementeaza o interfata Operatiuni care are metodele

public float getSumaTotala()

la suma existenta în cont se adauga dobanda aferenta

public float getDobanda()

public void depunere(ContBancar contDest, float suma)

public void extragere (ContBancar contDest, float suma)

Toate clasele vor avea constructori ti metode de prelucrare ti de afitare a datelor membru. De asemenea, se va crea o clasa ClientBanca pentru instantierea de obiecte ale celor trei clase specificate.

Back to Top