joi, 8 iulie 2010

Din capcanele polimorfismului (1)

Cuvântul "polimorfism" provine din limba greacă și înseamnă "având mai multe forme". In limbajul Java, polimorfismul are 3 aspecte: supraîncărcare (overloading), suprascriere (overriding) și legare dinamică (dynamic binding). Deoarece acest blog nu se vrea a fi un curs teoretic, definițiile celor 3 aspecte le puteți citi direct din documentația Sun. Subliniez totuși faptul ca cele trei tipuri de polimorfism nu pot fi complet separate, adesea întâlnindu-se toate 3 laolaltă. In continuare vă prezint un exemplu care ilustrează două caracteristici importante ale suprascrierii (dar pentru a răspunde la întrebări, e necesar să înțelegeți și legarea dinamică - exact ce spuneam mai sus despre interdependența aspectelor).

/**
 * De ce nu se compileaza metoda1 si metoda2 din clasa Clasa02 ?
 * (la metoda2(), nu clasa anonima new Object(){... e problema)
 * Ce probleme ar putea aparea daca limbajul Java ar permite 
 * compilarea codului respectiv ? 
 * Scrieti un program care sa justifice raspunsul la ultima
 * intrebare.
 *  (indiciu: folositi polimorfism de tip dynamic binding)
 */
class Clasa01 {
    public int metoda1(int i1, int i2, boolean b){
        if (b){
            return i1 * i2;
        }else{
            return i1 - i2;
        }
    }  
    protected String metoda2(String s){
        return s + " etc";
    }
}

class Clasa02 extends Clasa01 {
    int metoda1(int a, int b, boolean c){
        return (1 + super.metoda1(a, b, c));
    }   
    public Object metoda2(String s){
        final String str = s;
        return new Object(){
            public String toString(){
                return str;
            }
        };
    }  
}

Niciun comentariu:

Trimiteți un comentariu