【问题标题】:Is there a way to use a single Object in Java to run methods from other classes that are inherited?有没有办法在 Java 中使用单个 Object 来运行来自其他继承类的方法?
【发布时间】:2019-12-17 21:24:51
【问题描述】:

我遇到了一个要求创建单个对象的问题,在这个例子中,a 每次我运行 eat 方法时,它都会打印出 apple,banana同行,按顺序,然后循环回苹果。

我很确定我需要创建 3 个类 class apple class banana class peer,每个都继承 class Order 并且每个都有一个方法 eat()

不使用 Java 基本类型、循环、if 语句,只使用面向对象的特性,我怎样才能使这段代码成为可能?

Order a = new Order();
//a will change state after each method is called.
a.eat(); // Prints "ate apple"
a.eat(); // Prints "ate banana"
a.eat(); // Prints "ate peer"
a.eat(); // Prints "ate apple"
a.eat(); // Prints "ate banana"
a.eat(); // Prints "ate peer"

【问题讨论】:

  • 如果你只是创建一个对象,每次调用一个方法时它的行为都会改变,这与多态性没有任何关系,多态性是关于类如何从其他类型继承行为。
  • baeldung.com/java-state-design-pattern 状态设计模式但仍需要 3 个额外的类?
  • @Evgeniy 不需要额外的 3 个课程。我认为应该使用它,但可能是错误的。
  • @Michael 为什么这可能是错误的?通过创建一个额外的对象,您将使用多态性,它是面向 OOP 的。如果你想通过额外的水果来扩展它,这很容易做到。 + 您希望在 Order NP 中拥有整个逻辑,然后使用状态来改变行为

标签: java oop inheritance polymorphism


【解决方案1】:

由于您的状态是纯数据并且没有与之相关的任何行为,我认为完整的状态设计对于这个问题来说是多余的。我建议最简单的方法是使用一个非常基本的循环链表,每个节点都有一个水果。 Order 类可以只打印当前节点的数据,然后在每次调用 eat() 时前进到下一个节点。

例如 给定一个 NodeOrder 类,像这样

class Node {
    Node next;
    String data;

    public Node(String data) {
        this.data = data;
    }
    public String getData() {
        return data;
    }
    public Node getNext() {
        return next;
    }
    public void setNext(Node next) {
        this.next = next;
    }
}
class Order {
    Node node;

    public Order() {
        Node apple = new Node("apple");
        Node banana = new Node("banana");
        Node pear = new Node("pear");

        apple.setNext(banana);
        banana.setNext(pear);
        pear.setNext(apple);

        this.node = apple;
    }

    public void eat() {
        System.out.println(node.getData());
        node = node.getNext();
    }
}

你会得到想要的行为:

public static void main(String[] args) {
    Order a = new Order();
    a.eat(); // apple
    a.eat(); // banana
    a.eat(); // pear
    a.eat(); // apple
    a.eat(); // banana
    a.eat(); // pear
}

【讨论】:

    猜你喜欢
    • 2021-03-17
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多