好的,假设我有一个名为 Pancake 的类。

Pancake.java 看起来像这样:

public class Pancake {
    public boolean shouldEat() {
        return false;
    }
}

现在,我根本不想编辑 Pancake.java。我想要做的就是更改 shouldEat() 从不同的类返回的内容,例如“NotPancake.java”。

我知道如果我有类似的东西
public boolean eat = false;

我可以通过执行类似 Pancake.eat = true 之类的操作轻松更改它,但是有没有办法更改 shouldEat() 返回的内容而无需以类似方式编辑类?

谢谢。

最佳答案

这样做的方法是基于 Object Oriented programming

public class NotPancake extends Pancake {

 @Override
 public boolean shouldEat() {
        return true;
    }
}

这里发生的魔法称为“继承”,是分配给 OO 的四个元素之一。

这里发生的是你定义了从 Pancake 交付的新结构。

这意味着 NotPancake 继承了 Pancake 形式。所以 NotPancake 就是 Pancake。
 Pancake p = new Pancake();
 Pancake q = new NoPancake();

 print(p.shouldEat()); //Will be false
 print(q.shouldEat()); //Will be true

这种关系使我们有可能改变行为,我们可以重新定义父类(super class)中的所有公共(public)、保护和默认方法。

当在我们的子类中定义一个具有相同签名的方法时,我们说这个方法覆盖了前一个方法。在 Java 中,您应该添加注释 @Override 以额外通知编译器有关它的信息。

这是一种方法。继承很简单,但在编码复杂程序时会产生很多问题,另一种解决方案称为 composition 。并且您应该始终更喜欢组合而不是继承。

构图是基于抽象性的。要使用它,需要 interface。接口(interface)是对实现它的类所遵循的契约的描述。
public interface Dish {

   boolean isEatable();

}

接口(interface)的名称应该代表一些抽象的一般概念。
 public class Pancake implements Dish {
  @Override
  public boolean shouldEat() {
     return false;
  }
}

public class Carrot implements Dish {

 @Override
 public boolean shouldEat() {
     return true;
  }
}

用法多不相同。
 Dish dish1 = new Pancake();
 Dish dish2 = new NoPancake();

 print(dish1.shouldEat()); //Will be false
 print(dish2.shouldEat()); //Will be true

在这个小例子上很难展示组合的好处。但是是演示 coding to interface 方法。

关于java - 在不修改类本身的情况下编辑类中的返回值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22052797/

10-11 02:34