嗯,这有点尴尬,但我忘了如何用普通的旧Java做以下工作:
abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
class Flea extends Animal {
private double jumpHeight;
public Flea(String name, double jumpHeight) {
super(name);
this.jumpHeight = jumpHeight;
}
public double jump() {
return jumpHeight();
}
}
class Giraffe extends Animal {
private int strideLength;
public Giraffe(int strideLength) {
super("Berta");
this.strideLength = strideLength;
}
public int stride() { return strideLength; }
}
class Gorilla extends Animal {
private String call;
public Gorilla(String call) {
super("Boris");
this.call = call;
}
public String call() { return "Gorilla says " + call; }
}现在,我想在运行时决定适当的方法,而不必将所有的方法添加到每个动物(没有抽象的方法)和没有意义的占位符(就像想象一个跳蚤没有调用)。
我想做这个没有铸造。所以no
if(Animal instanceof Gorilla) ((Gorilla) animal).call();我可以想出一个包含jumpable接口的解决方案,并且可以使用它,但是我确信有一个特定的模式正好适合这类任务。
有什么想法吗?
发布于 2015-11-23 18:07:52
你应该考虑一下访客模式
abstract class Animal {
public abstract void acceptAnimalVisitor(AnimalVisitor visitor);
}
class Flea extends Animal {
public void acceptAnimalVisitor(AnimalVisitor visitor){
visitor.visit(this);
}
}
// other animals also implementing acceptAnimalVisitor
public class AnimalVisitor{
public void visit(Flea flea){
// ...
}
// other visit methods for the other animals
}但是,这至少需要一个方法( accept方法本身)。还要注意,您可以将AnimalVisitor转换为接口,这样就可以轻松地实现所谓的双重调度。
https://stackoverflow.com/questions/33877421
复制相似问题