Polymorphie Polymorphie in Parametern

xehpuk

Top Contributor
Moin!

Ich habe zwar schon eine Weile mit Java zu tun, habe bisher aber keine Antwort auf diesen eigentlich einfach erscheinenden Sachverhalt gefunden:

Man hat eine abstrakte Klasse/ein Interface und darunter implementierende Klassen. Des Weiteren hat man eine Klasse mit einer Operation, die als Parameter diese Klasse/dieses Interface hat und je nach konkreter Klasse auch etwas Unterschiedliches anstellt.
Zur konkreten Klasse zu deligieren geht nicht, da diese ja strohdoof sein und von der anderen Klasse gar nichts wissen soll.

Hier einfach mal ein Beispiel:
Java:
public abstract class Animal {}
Java:
public class Cat extends Animal {}
Java:
public class Dog extends Animal {}
Java:
public class AnimalManager {
	private final Collection<Animal> animals = new ArrayList<Animal>();
	private boolean nice = false;
	
	public void makeNoises() {
		for (Animal animal : animals)
			System.out.println(makeNoise(animal));
	}
	
	public String makeNoise(Animal animal) {
		// ???
		return null;
	}
	
	private String makeNoise(Cat cat) {
		return nice ? "Miau." : "Fauch.";
	}
	
	private 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();
	}
}
Wie löst man dies nun richtig? Wohl nicht durch das Überprüfen des Laufzeittyps mit einer Abfrage pro Implementierung?
Als weiteres Problem seh ich hier noch, dass Animal über eine anonyme Klasse extendiert werden kann, wodurch die
Code:
makeNoise
dann nicht vollständig ist. Gibt es eine Möglichkeit, zu verhindern, dass eine abstrakte Klasse "von außen" extendiert wird?
Code:
final
geht hier ja nicht, weil die Klasse bereits Subklassen besitzt.
 

MySelV

Aktives Mitglied
Hi,

spontan würde ich sagen:
Die Methode "makeNoise" gehört wie folgt in die Klasse Animal und zwar ohne Animal als Parameter.

Java:
public abstract String makeNoise(boolean nice);

Dann kann auf jeden Animal "makeNoise" aufgerufen werden. Den Parameter "nice" sollte man da vielleicht eher übergeben.

Grüße
 

xehpuk

Top Contributor
Nun gut, dann erweitere ich mein Beispiel eben. ;)

Java:
public class AnimalManager {
	// ...
	private int noises = 0;
	
	// ...
	
	private String makeNoise(Cat cat) {
		noises += 42;
		return nice ? "Miau." : "Fauch.";
	}
	
	private String makeNoise(Dog dog) {
		noises += 1337;
		return nice ? "Wuff." : "Bell.";
	}
	
	// ...
}
 
S

SlaterB

Gast
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:
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);
    }
}
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
 

xehpuk

Top Contributor
Hmm, das ergibt natürlich Sinn, auch wenn es auch nicht so toll aussieht.

Weswegen hat man sich denn dazu entschieden, bei Operationen mit polymorphen Parametern nicht die speziellste Implementierung zu nehmen?

Als Beispiel:
Java:
public class PolymorphieTest {
	static void foo(SuperClass superClass) {
		System.out.println("foo(Super)");
	}
	
	static void foo(SubClass subClass) {
		System.out.println("foo(Sub)");
	}
	
	public static void main(String[] args) {
		SuperClass superClass = new SubClass();
		SubClass subClass = new SubClass();
		
		superClass.foo();
		subClass.foo();
		
		foo(superClass);
		foo(subClass);
	}
}

abstract class SuperClass {
	void foo() {
		System.out.println("Super.foo()");
	}
}

class SubClass  extends SuperClass {
	void foo() {
		System.out.println("Sub.foo()");
	}
}
Ausgabe:
Code:
Sub.foo()
Sub.foo()
foo(Super)
foo(Sub)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Vererbung - Polymorphie Java Basics - Anfänger-Themen 37
T Beispiel Polymorphie, Tier hund = new Hund(); Java Basics - Anfänger-Themen 3
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
T Polymorphie und LSP Java Basics - Anfänger-Themen 4
KogoroMori21 Polymorphie-Verständnis Java Basics - Anfänger-Themen 5
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
NeoLexx Zuweisungskompatibilität zwischen Vererbungsbeziehungen (Polymorphie) Java Basics - Anfänger-Themen 18
A Polymorphie Java Basics - Anfänger-Themen 4
O Polymorphie Java Basics - Anfänger-Themen 3
J Polymorphie und Dynamisches Binden richtig nutzen Java Basics - Anfänger-Themen 11
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
K Polymorphie Java Basics - Anfänger-Themen 6
C Polymorphie Was genau ist Polymorphie und wann genau sollte man es verwenden? Java Basics - Anfänger-Themen 9
C Kurze Frage zur Polymorphie Java Basics - Anfänger-Themen 1
J Polymorphie - Beispielcode Java Basics - Anfänger-Themen 7
D Vererbung / Polymorphie Java Basics - Anfänger-Themen 5
T Polymorphie Java Basics - Anfänger-Themen 4
C Polymorphie - Erklärung bitte Java Basics - Anfänger-Themen 5
C Polymorphie Java Basics - Anfänger-Themen 1
L Polymorphie Polymorphie verstehen? Java Basics - Anfänger-Themen 2
H Polymorphie Verständnisproblem Vererbung/Polymorphie Java Basics - Anfänger-Themen 4
N Methoden Polymorphie Java Basics - Anfänger-Themen 11
M OOP Polymorphie/Vererbung Verständnisproblem Java Basics - Anfänger-Themen 2
E Polymorphie Beispiel Polymorphie Java Basics - Anfänger-Themen 2
K Polymorphie und instanceOf Operator Java Basics - Anfänger-Themen 6
S Vererbung Objekte in verwandten Klassen (Kovarianz, Polymorphie) Java Basics - Anfänger-Themen 4
R Polymorphie Java Basics - Anfänger-Themen 2
M Vererbung Enum Vererbung/Polymorphie Java Basics - Anfänger-Themen 2
P Polymorphie Java Basics - Anfänger-Themen 6
S Polymorphie und Vererbung Java Basics - Anfänger-Themen 6
H Kleines Problem mit der Polymorphie Java Basics - Anfänger-Themen 2
A OOP Polymorphie Java Basics - Anfänger-Themen 6
2 Interfaces, Polymorphie und Methoden. Java Basics - Anfänger-Themen 14
C OOP Frage zu Polymorphie Java Basics - Anfänger-Themen 4
P Eine Frage begzl. Interface / Polymorphie Java Basics - Anfänger-Themen 11
Y Kleine Verständnisfrage zum Thema dynamische Polymorphie Java Basics - Anfänger-Themen 3
F Verständnisfrage Objekt instanzierung / Polymorphie Java Basics - Anfänger-Themen 10
T Polymorphie:Überschreiben der Methode klappt nicht Java Basics - Anfänger-Themen 4
T Vererbung und Polymorphie Java Basics - Anfänger-Themen 7
C Unterschied zwischen Polymorphie und Typcasting Java Basics - Anfänger-Themen 10
S Polymorphie Verständnisproblem Java Basics - Anfänger-Themen 4
Z Vererbung oder Polymorphie? Java Basics - Anfänger-Themen 5
J Polymorphie Java Basics - Anfänger-Themen 6
G Polymorphie und Interface Java Basics - Anfänger-Themen 2
S Polymorphie und Vererbung Java Basics - Anfänger-Themen 25
S Polymorphie - oder auch spanisches Dorf? Java Basics - Anfänger-Themen 5
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
F HttpURLConnection mit vielen Parametern Java Basics - Anfänger-Themen 3
J Übergabe von Parametern an andere Methoden Java Basics - Anfänger-Themen 5
E Methode mit Parametern um Objekte zu übergeben Java Basics - Anfänger-Themen 4
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
J Methode mouseClicked mit zu übergebenden Parametern Java Basics - Anfänger-Themen 1
J Erste Schritte Java CMD Taschenrechner mit Parametern! Java Basics - Anfänger-Themen 16
B Input/Output Konsolenbefehle mit Parametern Java Basics - Anfänger-Themen 5
C Objekte mit Parametern sortieren Java Basics - Anfänger-Themen 8
U assertEquals mit drei Parametern? Java Basics - Anfänger-Themen 4
F Klassen Ein nicht existierendes Objekt in Parametern übergeben Java Basics - Anfänger-Themen 16
F Java-Programm aus CMD ausführen mit Parametern Java Basics - Anfänger-Themen 7
M Konstruktor mit unterschiedlichen Parametern? Java Basics - Anfänger-Themen 3
M Methode mit beliebigen Parametern in abstrakter Klasse definieren Java Basics - Anfänger-Themen 8
A Methoden Methode mit Parametern Java Basics - Anfänger-Themen 25
M Datentypen Konstruktor mit generischen Parametern überladen Java Basics - Anfänger-Themen 3
M Collections mit >2 type Parametern? Java Basics - Anfänger-Themen 8
M Singleton mit Parametern im Konstruktor Java Basics - Anfänger-Themen 18
M Fragen zu Methoden (void/return), Übergabe von Parametern Java Basics - Anfänger-Themen 3
N OOP Dynamische Objekte und nach Parametern durchsuchen Java Basics - Anfänger-Themen 4
N Vererbung von Konstruktoren mit Parametern Java Basics - Anfänger-Themen 7
D Funktion mit optionalen Parametern möglich? Java Basics - Anfänger-Themen 3
A Konstruktor mit Parametern Java Basics - Anfänger-Themen 7
O Kleines Problem mit Konstruktor mit Parametern aus generischer Klasse...oder so ;) Java Basics - Anfänger-Themen 2
R Drag&Drop mit Parametern Java Basics - Anfänger-Themen 6
G Übergabe von Parametern an JSP Java Basics - Anfänger-Themen 3
M Methoden aufruf mit optionalen Parametern! Java Basics - Anfänger-Themen 4
G Thread mit Parametern Java Basics - Anfänger-Themen 5
H array aus parametern + hilfe! Java Basics - Anfänger-Themen 4
L Problem mit Aufruf von Objekten,übergeben von Parametern Java Basics - Anfänger-Themen 6
K rekursive Funktion mit mehreren Parametern Java Basics - Anfänger-Themen 5
S Kommandozeile mit 2 Parametern int und boolean Java Basics - Anfänger-Themen 5
G Fenster mit Parametern aufrufen Java Basics - Anfänger-Themen 4
D Klassenaufruf mit mehreren Parametern vereinfachen Java Basics - Anfänger-Themen 10
L JAR-Datei mit Parametern aufrufen Java Basics - Anfänger-Themen 4
P final mit Parametern Java Basics - Anfänger-Themen 3
P Vererbung: Konstruktor mit Parametern Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben