Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich bin ziemlicher Anfänger was Java angeht, ich habe den folgenden funktionierenden Code mal eben als Beispiel für euch geschrieben. Meine Frage: Kann man das schöner machen? Ich speichere die Objekte ja in einem Container der für Objekte vom Typ Quadruped bestimmt ist, somit kann ich auch nur auf die Methoden dieser Basisklasse zugreifen. Was für Möglichkeiten habe ich sonst noch außer zwei separate Container dafür zu verwenden?
Java:
import java.util.ArrayList;
public class Test {
public static void main(String... args) {
ArrayList<Quadruped> animals = new ArrayList<Quadruped>();
Cat dirtyCat = new Cat();
animals.add(dirtyCat);
Dog dirtyDog = new Dog();
animals.add(dirtyDog);
for (final Quadruped dirtyAnimal : animals) {
dirtyAnimal.peeOnTheFloor();
if (dirtyAnimal instanceof Cat) {
((Cat)dirtyAnimal).miew();
} else {
((Dog)dirtyAnimal).woof();
}
}
}
}
Java:
public class Quadruped {
public void peeOnTheFloor() {
System.out.println("Psssscchhhhttttttttttttttttttttt...");
}
}
Java:
public class Cat extends Quadruped {
public void miew() {
System.out.println("Miew!");
}
}
Java:
public class Dog extends Quadruped {
public void woof() {
System.out.println("Woof!");
}
}
Ich hoffe ich versteht meine Frage und könnt mir weiterhelfen!
import java.util.ArrayList;
public class Test {
public static void main(String... args) {
ArrayList<Quadruped> animals = new ArrayList<Quadruped>();
Cat dirtyCat = new Cat();
animals.add(dirtyCat);
Dog dirtyDog = new Dog();
animals.add(dirtyDog);
for (final Quadruped dirtyAnimal : animals) {
dirtyAnimal.peeOnTheFloor();
dirtyAnimal.makeSound();
}
}
}
Java:
public class Quadruped {
public void peeOnTheFloor() {
System.out.println("Psssscchhhhttttttttttttttttttttt...");
}
public abstract void makeSound();
}
Java:
public class Cat extends Quadruped {
public void makeSound() {
System.out.println("Miew!");
}
}
Java:
public class Dog extends Quadruped {
public void makeSound() {
System.out.println("Woof!");
}
}
Es gibt noch weitere Möglichkeiten: Reflection, aber das ist Böse und sollte nicht für diesen Zweck genutzt werden. Meine Methode (Überschreiben von Methoden) ist die gängige (Besser wäre sogar eher mit einem Interface statt Vererbung arbeiten.)
Du könntest Quadruped zu einem Interface machen, mit den Methoden
miew
woof
Cat bzw. Dog implementieren dieses Interface. Die Methode woof bei Cat KANN eine Exception werfen oder nix machen.
Du könntest auch eine Adapter-Klasse schreiben, die das Interface implementiert und ALLE Methoden leer imnplementiert. Dann kannst du in Cat/Dog von der Adapter-Klasse erben und musst nur noch die Funktion überschreiben, die bei Cat/Dog Sinn macht.
Das ist aber von Anzahl der Methoden und Lieblingsstil abhängig und natürlich vom Tidenhub
import java.util.ArrayList;
public class Test {
public static void main(String... args) {
ArrayList<Quadruped> animals = new ArrayList<Quadruped>();
Cat dirtyCat = new Cat();
animals.add(dirtyCat);
Dog dirtyDog = new Dog();
animals.add(dirtyDog);
for (final Quadruped dirtyAnimal : animals) {
dirtyAnimal.peeOnTheFloor();
dirtyAnimal.makeSound();
}
}
}
Java:
public class Quadruped {
public void peeOnTheFloor() {
System.out.println("Psssscchhhhttttttttttttttttttttt...");
}
public abstract void makeSound();
}
Java:
public class Cat extends Quadruped {
public void makeSound() {
System.out.println("Miew!");
}
}
Java:
public class Dog extends Quadruped {
public void makeSound() {
System.out.println("Woof!");
}
}
Es gibt noch weitere Möglichkeiten: Reflection, aber das ist Böse und sollte nicht für diesen Zweck genutzt werden. Meine Methode (Überschreiben von Methoden) ist die gängige (Besser wäre sogar eher mit einem Interface statt Vererbung arbeiten.)
Nunja, hier hast du die Methoden umbenannt, gehen wir mal davon aus das das nicht möglich ist, wie soll ich es dann machen? Die Idee mit dem Interface finde ich persönlich nicht ganz so gut, ein Objekt der Klasse Dog hat dann ja auch die Methoden der Klasse Cat, auch wenn diese keine Funktion haben und ggf. leer sind könnte es ziemlich verwirrend sein, oder nicht?
Nunja, hier hast du die Methoden umbenannt, gehen wir mal davon aus das das nicht möglich ist, wie soll ich es dann machen? Die Idee mit dem Interface finde ich persönlich nicht ganz so gut, ein Objekt der Klasse Dog hat dann ja auch die Methoden der Klasse Cat, auch wenn diese keine Funktion haben und ggf. leer sind könnte es ziemlich verwirrend sein, oder nicht?
Eigentlich gibt es nur zwei Möglichkeiten: entweder du kannst den Code ändern oder nicht. Im ersten Fall gehört in die Oberklasse Quadruped auf jeden Fall eine abstracte Methode "speak" oder so, die der Hund mit einem "wuff" und die Katze mit einem "Miau" implementiert.
Wenn du den Code nicht ändern kannst, wird es in der Tat etwas unschön. Dann solltest du zuerst die Person schlagen, die für den Code verantwortlich ist! Das Beispiel mit den Tieren und den Geräuschen die sie machen (über eine "speak" oder "gibLaut" Methode) ist DAS Beispiel für Vererbung.
Zusätzlich zu den von dir beschriebenen Varianten (eine List<Quadruped> mit Castings, separate Listen für Hunde und Katzen) könntest du für jede Tierart eine Adapterklasse schreiben, die die benötigten Castings verkapselt:
Java:
abstract class SpeakingQuadruped extends Quadruped{
abstract void speak();
}
class SpeakingCat extends SpeakingQuadruped{
private Cat cat;
public SpeakingCat(Cat c){
this.cat = c;
}
public void speak(){
cat.miew();
}
}