我想知道如何拒绝访问类的超类的方法?
示例:我有一个类门和一个类Emptyness,它基本上只是我的应用程序的一扇门,现在我想继承大多数门的方法,但我不希望用户能够调用'关闭空虚的方法,我该怎么做?
答案 0 :(得分:3)
我们显然无法降低覆盖方法的可见性。如果Door
上的关门方法为public
,则Emptyness
中的覆盖方法不能为私有...
通常的方法是覆盖Emptyness
中的关闭门方法,只是不执行任何操作或抛出一些UnsupportedOperationException
(如Iterator
的实现者那样做,如果他们不允许删除元素)。
示例:
public class Door {
public void closeDoor() {
// closing door actions
}
}
public class Emptyness extends Door {
@Override void closeDoor() {
// do nothing or
throw new UnsupportedOperationException("Can't close door on Emptyness");
}
}
答案 1 :(得分:2)
听起来Emptyness
对Door
的“我应该是一个子类”测试失败了。测试是以下句子为真:Emptyness
是Door
。由于Door
可以关闭,Emptyness
不符合该要求。
建议使用聚合而不是继承。让Emptyness
实现自己的接口(或其他一些相关接口,但不是Door
)和包含用于满足相关操作的Door
实例。< / p>
除非 close
被定义为可选的(通过Door#close
,否则执行覆盖throws
操作以执行任何操作或抛出异常等操作是完全不合适的标签为相关的例外)。 (并且要注意类层次结构中的“可选”操作,它们通常表示设计问题。不一定总是,但通常。)Andreas给出Iterator#remove
的示例,例如:Iterator#remove
被标记为抛出UnsupportedOperationException
。如果Door#close
被标记为这样,并且如果您对这种做事方式感到满意,那就太好了,你就在那里。但如果没有,则Emptyness
未能遵守Door
合同,这通常意味着您需要采取其他方式。
答案 2 :(得分:0)
在课程门中私密。因为如果您在超级班级中有公共或受保护,那么 在向下层次结构中具有更严格的访问修饰符。所以你不能在Empty类中私有,而是你必须在Door类中。
答案 3 :(得分:0)
有很多选择。选择适合您需求的
private
创建方法final
,使其无法被覆盖,并添加逻辑检查,如果从instanceof
空虚调用该方法,则抛出异常。
public class Emptiness extends Door{
public static void main(String[] args) throws Exception {
Door x = new Emptiness();
x.somemethod();
}
}
门类
public class Door {
final public void somemethod() throws Exception{
if(this instanceof Emptiness){
throw new Exception();
}
}
}
答案 4 :(得分:0)
为什么不使用Designer Pattern。 由于closeDoor方法对于Door的所有子类都不常见,因此它根本不应出现在Door类中,而是使用close方法创建名称为Closable的接口,在ClosableTrue和ClosableFalse等某些类中实现该接口。现在在Closable类型的Door类中创建一个引用变量,并在类的构造函数中使用ClosableTrue或ClosableFalse对象初始化它,具体取决于传递给构造函数的参数类型。现在每当在Door的任何对象或Door的子类上调用close方法时,将被调用的方法将是其类用于初始化Door的构造函数的方法。您可以实现ClosableFalse类的close方法,而无需有意义的功能。