我有几个类(Sub1
,Sub2
,Sub3
)继承了抽象类(Abs
)。所有Sub类都有几个属性(size
,delay
等),它们对所有实例都是相同的(如静态属性)。我想重新组合所有这些子类属性(和访问器),以避免重复代码并从一个地方初始化它。有可能吗?
这是一个代码示例,显示了我为获得所需行为而必须采取的措施:
public abstract class Abs {
protected static final int DEFALUT_SIZE = 1000;
protected static final int DEFALUT_DELAY = 1000;
}
class Sub1 extends Abs {
private static int size;
private static int delay;
public Sub1() {
size = DEFALUT_SIZE;
delay = DEFALUT_DELAY;
}
public void setSize(int size) { this.size = size; }
public int getSize() { return size; }
public void setDelay(int delay) { this.delay = delay; }
public int getDelay() { return delay; }
}
class Sub2 extends Abs {
private static int size;
private static int delay;
public Sub1() {
size = DEFALUT_SIZE;
delay = DEFALUT_DELAY;
}
public void setSize(int size) { this.size = size; }
public int getSize() { return size; }
public void setDelay(int delay) { this.delay = delay; }
public int getDelay() { return delay; }
}
class Sub3 extends Abs {
/* Same code here */
}
我想做以下事情:
Sub1 sub1 = new Sub1();
int size = Sub1.getSize(); // size == 1000
Sub1.setSize(500);
Sub2.setSize(700);
size = sub1.getSize(); // size == 500
size = Sub1.getSize(); // size == 500
size = Sub2.getSize(); // size == 700
使用这个解决方案,我被迫在每个子类中重写所有相同的代码。
我了解到静态属性没有被继承,所以不可能从抽象类中这样做......
答案 0 :(得分:1)
通常一个好主意是,在除常量之外的所有情况下,关键字static
都是邪恶的,应该不惜一切代价避免使用。
如果你从大小和延迟前删除了static
关键字,使它们受到保护,并将它们与初始化代码一起移动到抽象Abs类中,以设置它们的初始值以及访问器和变更器(getters)然后你就可以从子类中删除它们的声明和初始化。
您的代码应如下所示:
public abstract class Abs {
private static final int DEFALUT_SIZE = 1000;
private static final int DEFALUT_DELAY = 1000;
private int size = DEFAULT_SIZE;
private int delay = DEFAULT_DELAY;
public void setSize(int size) { this.size = size; }
public int getSize() { return size; }
public void setDelay(int delay) { this.delay = delay; }
public int getDelay() { return delay; }
}
然后扩展Abs类的任何东西都将具有这些属性。
要在对象之间共享这些属性,您必须做一些不同的事情,但有很多选择。您可以拥有一个公共类,该类包含在创建时注入每个实例的共享值,或者您可以使用某种事件/观察者模式。然而,首先想要这是一件非常奇怪的事情。通常我们会有某种代表这些信息的中心对象,只是根据需要传递它 - 你通常不会在子类上设置setter和getter来实现它。您所拥有的是类似于管理全球属性的服务。