/**
 * Laboratorio, paso 1: antes de ejecutar este programa, escriban en papel
 * qué imprime cada línea y por qué. Después ejecútenlo con
 *     java -cp build LabTrace
 * y comparen. (No está en make test, para no ver la salida antes.)
 */
public class LabTrace {

    static class Animal {
        String sound() {
            return "...";
        }

        String meet(Animal other) {
            return "Animal saluda a Animal";
        }

        String meet(Dog other) {
            return "Animal saluda a Dog";
        }
    }

    static class Dog extends Animal {
        @Override
        String sound() {
            return "guau";
        }

        @Override
        String meet(Animal other) {
            return "Dog saluda a Animal";
        }
    }

    static class Puppy extends Dog {
        @Override
        String meet(Dog other) {
            return "Puppy saluda a Dog";
        }
    }

    public static void main(String[] args) {
        Animal a = new Dog();
        Animal b = new Puppy();
        Dog d = new Puppy();

        IO.println("1. " + a.sound());
        IO.println("2. " + b.sound());
        IO.println("3. " + a.meet(a));
        IO.println("4. " + a.meet(d));
        IO.println("5. " + b.meet(a));
        IO.println("6. " + b.meet(d));
        IO.println("7. " + d.meet(b));
        IO.println("8. " + d.meet((Dog) b));
        Object o = d;
        IO.println("9. " + ((Animal) o).meet(new Dog()));
    }
}
