首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时决定方法的使用。多态

在运行时决定方法的使用。多态
EN

Stack Overflow用户
提问于 2015-11-23 17:54:30
回答 1查看 78关注 0票数 0

嗯,这有点尴尬,但我忘了如何用普通的旧Java做以下工作:

代码语言:javascript
复制
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

代码语言:javascript
复制
if(Animal instanceof Gorilla) ((Gorilla) animal).call();

我可以想出一个包含jumpable接口的解决方案,并且可以使用它,但是我确信有一个特定的模式正好适合这类任务。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-11-23 18:07:52

你应该考虑一下访客模式

代码语言:javascript
复制
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转换为接口,这样就可以轻松地实现所谓的双重调度

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33877421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档