1

我不太确定如何描述我想要的这种模式,但我想要这样的东西:

public abstract class Parent {
    protected abstract boolean foo = false; //this doesn't compile
}

public class Child1 extends Parent {
    protected boolean foo = true;
}

我该怎么做呢?

想象一下我有 1Parent节课,但像 20Child节课。对于绝大多数孩子来说,foo应该是false。但是,Child1(和其他一些)是带有foo = true;.

什么是最合适的面向对象设计和代码高效的方式来做到这一点?

4

5 回答 5

2

首先,实例变量不能是abstract,只有方法可以。

要拥有压倒一切的行为,您需要方法。我会定义一个方法,比如说,isFoo定义Parent为 return false。没有子类需要覆盖它,除了“奇怪的”,它可以覆盖它以返回true

或者,你可以有一个Parent被调用的子类WeirdOne(当然不必是那个名字)。它唯一做的就是覆盖isFoo返回true。然后Child1 和任何其他“奇怪”的类 subclass WeirdOne。这样,它只在一个地方被覆盖。

于 2013-10-15T00:08:14.607 回答
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
}
于 2013-10-15T00:09:53.610 回答
1

我认为你需要这样做

public abstract class Parent {

    protected boolean check = false;

}

public class Child extends Parent 
{
    public void method()
    {
        this.check=true;
    }

}

// 你也可以把它放在构造函数中

于 2013-10-15T00:13:09.063 回答
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;
}
于 2013-10-15T00:07:51.117 回答
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.
于 2013-10-15T00:12:01.810 回答