【发布时间】:2016-10-21 09:25:13
【问题描述】:
假设我有以下课程:
public class Cat {
private final String noise = "meow";
pulic static void makeNoise(){
System.out.println(noise);
}
}
public class Dog {
private final String noise = "woof";
pulic static void makeNoise(){
System.out.println(noise);
}
}
如您所见,这两个类共享几乎相同的代码。要删除冗余代码,我会创建一个这样的父类:
public abstract class Animal {
protected final String noise;
public Animal(String noise) {
this.noise = noise;
}
public void makeNoise() {
System.out.println(noise);
}
}
public class Dog extends Animal{
public Dog(){
super("woof");
}
}
不幸的是,我遇到了两个问题:
- 既然使动物的噪音不再是静态的,作为常数 必须通过动物的构造函数分配,你会 需要创造一只猫或狗来获得该动物的噪音。甚至 虽然它是一个常数。
- 方法 makeNoise() 需要在 Animal 类中工作 - 它 默认情况下没有噪音。
一个可能的解决方案是这样的: 公共抽象无效 makeNoise(); 这既不允许,也不会消除将代码复制到 Animal 的每个孩子的需要。
您将如何消除动物子代中冗余代码的需要,同时保持方法 makeNoise 静态?
【问题讨论】:
-
您的代码无法编译。不清楚为什么要保留方法
static。不清楚你在问什么。 -
@saka1029 编辑被拒绝。不要妄下结论。
-
@EJP 上面的代码是一个数学类的简化版本。这个类包含各种函数来计算一些值。由于大多数这些函数都需要方法makeNoise(),我觉得有必要添加修饰符静态。这个类的实际子类添加了一些高级功能,并且对常量噪声有自己的价值:
-
而且它不能编译,因为你的静态方法使用了一个非静态成员变量。由你来解决这个问题。我们无法了解您的实际意图。帖子偏离主题至少有两个原因。
-
@EJP 不要使用 us。