Auf Thema antworten

Vererbung ist der einzige Weg,

wenn du eine Variable Animal vor dir liegen hast, gibt es außer über diese Klassenhierarchie oder if/else-Test auf die Klasse oder vergleichbar keinen Weg, automatisch passend weiterzuarbeiten,

hier noch eine Mittelvariante:

[code=Java]

public class Test

{

    public static void main(String[] args)

    {

        AnimalManager.main(null);

    }


}



class AnimalManager

{

    private final Collection<Animal> animals = new ArrayList<Animal>();

    private boolean nice = false;


    public void makeNoises()

    {

        for (Animal animal : animals)

            System.out.println(animal.decideNoice(this));

    }


    public String makeNoise(Animal animal)

    {

        // ???

        return null;

    }


    public String makeNoise(Cat cat)

    {

        return nice ? "Miau." : "Fauch.";

    }


    public String makeNoise(Dog dog)

    {

        return nice ? "Wuff." : "Bell.";

    }


    public static void main(String[] args)

    {

        AnimalManager manager = new AnimalManager();

        manager.animals.add(new Cat());

        manager.animals.add(new Dog());

        manager.makeNoises();

    }

}



abstract class Animal

{

    public abstract String decideNoice(AnimalManager m);

}



class Cat

    extends Animal

{

    public String decideNoice(AnimalManager m)

    {

        return m.makeNoise(this);

    }

}



class Dog

    extends Animal

{

    public String decideNoice(AnimalManager m)

    {

        return m.makeNoise(this);

    }

}

[/code]

die Methode decideNoice() ist in allen Subklassen gleich, muss aber jeweils dort implementiert werden,

weil nur dort die aktuelle Klasse bekannt und damit die richtige Methode im Manager gewählt wird

(statisch verlinkt, hat dann nicht viel mit Polymorphie zu tun)


ist glaube ich das Visitor Pattern



Oben