取消设置变量和方法

时间:2014-12-18 15:22:43

标签: java

我有一个抽象类,它被扩展为提供我需要的标准方法和变量。 但是,这一次,我必须扩展相同的类,但是一些变量和一些方法不能为我服务。所以我想知道是否有可能关闭这些变量/方法是无用的。我指定我被迫扩展这个类,我不能创建另一个。 例如,我有这个抽象类:

public abstract class A {
    protected int a, b, c;

    public abstract void A();
    public abstract void B();
    public abstract void C();
}

public class B extends A {
    public B() {
        a = 5;
        b = 7;

        A();
        B();
    }

    public void A() {
        System.out.println("A: " + a);
    }

    public void B() {
        System.out.println("B: " + b);
    }

    //Unset the variable 'c' and the method 'C()' because they are useless
}

其实我不知道这样做是否值得,我依靠你的知识。

4 个答案:

答案 0 :(得分:4)

这是不好的行为,建议通过在新的抽象超类中拉出AB的公共成员来分割您的类层次结构,并让其余的特定于类层次结构A中的A

这种情况类似于

public abstract class BaseClass {
    protected int a, b;

    public abstract void A();
    public abstract void B();
}

public abstract class A extends BaseClass {
    protected int c;

    public abstract void C();
}

public class B extends BaseClass {
}

答案 1 :(得分:2)

没有内置机制可以解除'变量或超类的方法。

标准解决方案是创建两个基类。

public abstract class A {
    protected int a, b;

    public abstract void A();
    public abstract void B();
}

public abstract class AC extends A {
    protected int c;

    public abstract void C();
}

一个(可怕的)解决方法,只适用于方法,可以实现类似下面的代码,禁止使用C()

@Override
public void C() {
  throw new UnsupportedOperationException("This method is not allowed for this class");
}

长话短说,javac将接受使用C(),但RuntimeException将在运行时发布。如果没有捕获,此异常将导致崩溃,但由于RuntimeException的性质,编译器不需要try语句...
好吧,那只是一段丑陋的代码= P

Nick L.在另一个回复中提出了一个更清洁的解决方法,包括将C()设置为私有。

答案 2 :(得分:1)

如前所述,这是糟糕的设计。如果在派生类中不存在需要的方法/字段,那么您应该将它们放在另一个抽象类中并派生出前一个。

作为一种解决方法,我认为你可以将B类中要公开访问的函数设置为私有,如果你不希望它是抽象的那样:

public class B extends A {

    //c property is private.

    public B() {
        a = 5;
        b = 7;

        A();
        B();
    }

    public void A() {
        System.out.println("A: " + a);
    }

    public void B() {
        System.out.println("B: " + b);
    }

    //This is set as publicly inaccessible, although implementation is provided.
    private void C() {}
}

答案 3 :(得分:0)

您可以做的唯一方法是将method c设为abstract。所以不需要实施。如果你需要在以后的子类中使用它,你可以使用它

public abstract void C();