由于我的代码内容很长,我会尽量保持抽象。 所以,我有一个抽象的父亲,包含适用于所有儿子的方法。
abstract class a {
protected final void a_method() {
...do stuff
}
}
我还有另外两个扩展
的类class b extends a {
static int _int = 3;
}
还有,
class c extends a {
static int _int = 2;
}
所以如你所见,我的所有b总是具有相同的静态_int变量,并且我的所有c总是具有相同的_int变量。
方法a_method()与两个儿子的代码完全相同,只是使用了儿子的变量。
我可以避免重复代码吗?
因为我的变量是静态的,所以我不能在a
中声明它,因为每个子类的类需要不同(每个扩展类的内容不同)
答案 0 :(得分:2)
更简单的方法是在类A中使用抽象方法返回子类int值。
abstract class a {
protected final void a_method() {
int i = getValue();
...do stuff
}
protected abstract int getValue();
}
在你的子类之后
class b extends a {
static int _int = 3;
protected int getValue() {
return _int;
}
}
答案 1 :(得分:1)
静态意味着变量属于Class而不是单个实例。由于您的需求是静态变量,在两个类中都有不同的值,因此您的问题不会被视为代码重复。
如果它不是静态的,你可以在类中定义变量,然后在b类和C类构造函数中初始化它。
答案 2 :(得分:1)
我在这种情况下使用的解决方案是a,b和c都实现了一个声明int getTheVariable()
的接口。这个方法是抽象的。
然后在getTheVariable()
中使用了a
。返回的值由具体实现决定。
interface Foo {
int getTheVariable();
}
abstract class A implements Foo {
abstract int getTheVariable();
int doSomeWork() {
return 5 * getTheVariable();
}
}
class B extends A implements Foo {
int getTheVariable() { return 3; }
}
class C extends A implements Foo {
int getTheVariable() { return 2; }
}
我没有尝试编译它,它应该是接近的。
现在'父'类A可以提供主代码,但可以根据需要使用B和C中的值。这些值中的值可以是静态的。