我有一个抽象类,它被扩展为提供我需要的标准方法和变量。 但是,这一次,我必须扩展相同的类,但是一些变量和一些方法不能为我服务。所以我想知道是否有可能关闭这些变量/方法是无用的。我指定我被迫扩展这个类,我不能创建另一个。 例如,我有这个抽象类:
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
}
其实我不知道这样做是否值得,我依靠你的知识。
答案 0 :(得分:4)
这是不好的行为,建议通过在新的抽象超类中拉出A
和B
的公共成员来分割您的类层次结构,并让其余的特定于类层次结构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();