gpt4 book ai didi

java - 决定运行时的方法使用。多态性

转载 作者:行者123 更新时间:2023-12-01 21:59:15 24 4
gpt4 key购买 nike

好吧,这有点尴尬,但我忘记了如何在普通的旧 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; }
}

现在我想在运行时决定适当的方法,而不必向每个 Animal 添加所有方法(没有抽象方法),也不需要无意义的占位符(就像想象 Flea 没有调用一样)。

我想进行强制转换。所以:

if(Animal instanceof Gorilla) ((Gorilla) animal).call();

我可以想出一个包含像 jumpable 这样的接口(interface)的解决方案,并且可以使用它,但我确信有一种特定的模式完全适合此类任务。

有什么想法吗?

最佳答案

您应该考虑visitor pattern :

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 转换为接口(interface),这样您就可以轻松实现所谓的 double dispatch .

关于java - 决定运行时的方法使用。多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33877421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com