我不确定如何描述我想要的这种模式,但我想要这样的事情:
public abstract class Parent {
protected abstract boolean foo = false; //this doesn't compile
}
public class Child1 extends Parent {
protected boolean foo = true;
}
我该怎么做?
想象一下,我有1 Parent
个班级,但是有20个Child
班级。对于绝大多数孩子,foo
应为false
。但是,Child1
(和其他几个)是foo = true;
的奇怪之处。
最合适的面向对象设计是什么,但是编写有效的方法呢?
答案 0 :(得分:2)
首先,实例变量不能是abstract
,只有方法可以。
要拥有覆盖行为,您需要方法。我会在isFoo
中定义一个方法,例如Parent
,该方法被定义为返回false
。没有子类需要覆盖它,除了“怪异的”,它可以覆盖它以返回true
。
或者,您可以将Parent
的子类称为WeirdOne
(当然不必是该名称)。它唯一能做的就是覆盖isFoo
以返回true
。然后Child1
和任何其他“怪异”类子类WeirdOne
。这样,它只在一个地方被覆盖。
答案 1 :(得分:2)
您可以使用一两个构造函数执行此操作:
public abstract class Parent {
protected boolean foo;
protected Parent() {
this(false); // initialize foo to default value
}
protected Parent(boolean fooValue) {
this.foo = fooValue;
}
}
public class Child1 extends Parent {
public Child1() {
super(true);
}
}
public class Child2 extends Parent {
// no explicit super(boolean) call in c'tor gives foo the default value
}
答案 2 :(得分:1)
我认为你需要这样做
public abstract class Parent {
protected boolean check = false;
}
public class Child extends Parent
{
public void method()
{
this.check=true;
}
}
//你也可以把它放在构造函数中
答案 3 :(得分:0)
如果要使用Parent
类扩展Child1
类,则必须输入:
public class Child1 extends Parent {
}
关于foo
参数,您不能将其设置为abstract
,因为它不是函数(也就是说,只能声明函数abstract
)。但是,您可以在子类中覆盖它。
public abstract class Parent {
protected boolean foo = false;
}
public class Child1 extends Parent {
@Override
protected boolean foo = true;
}
答案 4 :(得分:0)
不要使用字段。看看这个类的组合:
public abstract class Vehicle {
public abstract boolean isAerial();
}
public abstract Flyer extends Vehicle {
@Override
public final boolean isAerial() {
return true;
}
}
// Add Airplane, Helicopter, Dirigible, Rocket, etc.
public abstract Terrestrial extends Vehicle {
@Override
public final boolean isAerial() {
return false;
}
}
// Add Car, Truck, Boat, Bicycle, etc.