POO-ITBA / 2024_02

Consultas 2C 2024
2 stars 0 forks source link

TP6Ej8 #17

Open felipeboya opened 1 month ago

felipeboya commented 1 month ago

Hola, tengo una cosulta sobre el ejercicio 8 del TP6. Yo hice la implementacion de Bag haciendo que la clase BagImpl extienda a HashMap, pero vi que en las soluciones en vez de usar herencia tiene el HashMap como atributo. Queria saber si en este caso habia alguna diferencia y si mi solucion igualmente es correcta. La implementacion de los metodos es casi igual que en las soluciones, excepto remove que si le cambiaba el prototipo no compilaba, asi que lo tuve que dejar asi.

public class BagImpl<E> extends HashMap<E,Integer> implements Bag<E>{

    public void add(E elem){
        merge(elem, 1, (oldValue, newValue) -> oldValue + newValue);
    }

    @Override
    public boolean contains(E elem){
        return containsKey(elem);
    }

    @Override
    public int size(){
        int size = 0;
        for( E current : keySet() ){
            size += get(current);
        }
        return size;
    }

    @Override
    public int count(E elem) {
        return getOrDefault(elem, 0);
    }

    @Override
    public int sizeDistinct() {
        return keySet().size();
    }

    @Override
    public Integer remove(Object elem){
        if (!containsKey(elem)) {
            throw new NoSuchElementException();
        }
        if (get(elem) == 1) {
            super.remove(elem);
        } else {
            merge((E)elem, -1, (oldValue, newValue)-> oldValue+newValue);
        }
        return 0;
    }
}

Gracias!

fmeola commented 1 month ago

Hola @felipeboya En este caso es mejor plantear composición en vez de herencia porque al extender a HashMap estás ofreciendo también todos los métodos públicos de Map de forma que podría agregar elementos no sólo utilizando el add que implementaste sino también el put(K,V) que heredaste y no corresponde. Eso del remove que mencionás va en la misma línea, idealmente el add y remove deberían sobreescribir a los de la clase padre pero no lo podés hacer porque los signatures son distintos, otro indicio más de que herencia me va a dar problemas. No es un error grave porque no repetís código y supiste superar estos obstáculos que te trajo la herencia pero tené en cuenta los signatures de los métodos por si en otro ejercicio no podés cambiarlos (por ejemplo si te damos nosotros la interfaz).