Я новичок в Java и борюсь с проблемой дизайна. Я знаю, что использование instanceof
может указывать на дефект дизайна, и я понимаю часто заданные классы Animal/Dog/Cat
в качестве примера, заменяя bark()
и meow()
на makenoise()
и т.д.
Мой вопрос в том, что такое разумный дизайн, если мне нужно вызвать методы, которые не имеют соответствующего метода в зависимости от типа подкласса? Например, что, если я хочу вызвать новый метод biteleash()
, если класс является Dog
, но ничего не делать, если он Cat
?
Я считал, что biteleash()
в Animal
ничего не делает и переопределяет его в Dog
, но есть методы, подобные многим, так что это кажется неуклюжим решением. В аналогичном ключе, что, если вызывающему нужно сделать что-то другое в зависимости от того, какой подкласс он имеет, например. если подкласс является Cat
? Является ли instanceof
приемлемым здесь, или есть лучший способ?
public class Animal {
String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void makeNoise() {
System.out.println("Some noise for a generic animal!");
}
}
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeNoise() {
System.out.println("Meow");
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeNoise() {
System.out.println("Woof");
}
public void biteLeash() {
System.out.println("Leash snapped!");
}
}
import java.util.Random;
public class CodeExample {
public static void main(String[] args) {
Animal animal = getSomeAnimal();
System.out.println("My pet is called " + animal.getName());
animal.makeNoise();
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.biteLeash();
// do lots of other things because animal is a dog
// eg. sign up for puppy training lessons
}
}
private static Animal getSomeAnimal() {
Animal animal;
Random randomGenerator = new Random();
int randomInt = randomGenerator.nextInt(100);
if (randomInt < 50) {
animal = new Dog("Rover");
}
else {
animal = new Cat("Tiddles");
}
return animal;
}
}