miercuri, 7 iulie 2010

Conflict de interfețe

Dezvoltarea programelor Java este însoțită uneori de surprize neplăcute. Iată mai jos un exemplu: (se presupune că cele 2 interfețe deja există și nu pot fi modificate, iar noi vrem să scriem o clasă care le implementează pe amândouă).

/**
 * Puteti face clasa de mai jos sa se compileze?
 *  (aveti voie sa adaugati cod, dar nu sa modificati codul deja
 *   existent)
 */
public class ConflictDeInterfete implements Interfata1, Interfata2{
    // ce trebuie scris aici ?
}

interface Interfata1 {
    public void metoda1(String arg1);
}

interface Interfata2 {
    public int metoda1(String arg1);
    public long metoda2(int arg1, int arg2);   
}

Un comentariu:

  1. In mod normal, in ConflictDeInterfete ar trebui sa override metodele din interfete. Cum metoda1 din cele 2 interfete are aceeasi signatura, dar difera tipul returnat, nu poate fi suprascrisa de 2x. => codul nu se compileaza, pentru ca tipul returnat pentru metoda1 este incompatibil cu Interfata2.metoda1.
    @Override
    public long metoda2(int arg1, int arg2) {
    return 0;
    }
    @Override
    public void metoda1 (String arg1) {
    System.out.println("something..");
    }

    Solutia ar fi:
    -fie sa se schimbe numele metodei1 intr-una din interfete
    -fie sa se implementeze numai una din interfete.

    RăspundețiȘtergere