从超类分配对方法覆盖的较弱访问
Assign weaker access to method overriding from superclass
我有一个名为 Module
的 Class,它有一个方法 onEnable();
现在我有一个名为 Config
的 class 并且想要制作 onEnable();
方法 private
因为有一个预定义的动作和一个 class 扩展 Config
不应该允许改变行为。
有什么办法吗?
例子
class Module{
public void onEnable(){
}
}
一个class扩展模块允许使用onEnable
:
class HelloWorldModule{
@Override
public void onEnable(){
System.out.println("Hello, World!");
}
}
现在配置 Class,我希望 onEnable
是私有的,这样扩展配置的 Classes 就不能了!覆盖 onEnable
:
class Config{
@Override
private void onEnable(){
}
}
所以现在,扩展 Config
的名为 ProgrammConfig
的 class 不能覆盖 onEnable
.
但是,这不起作用,因为您无法将 public
方法重写为 private
方法。
你不能使用继承来解决这个问题。如果 Config
是 Module
的子 class,那么它 必须 提供 Module
的所有功能(至多)相同访问限制。将 subclass 视为 superclass 的特殊版本:它可以做 superclass 可以做的一切,可能更多,但绝不会更少。
您仍然可以根据需要实施 Config
class。只需跳过 subclassing,而是使用 Module
类型的私有字段,如下所示:
class Config {
private Module module;
public Config() {
module = new Module();
}
public int SomeFunctionFromModuleYouWantToExpose() {
return module.SomeFunctionFromModuleYouWantToExpose();
}
// ...
}
通过将方法声明为 public
,您是说应该可以在此 class 的每个实例上调用所述方法,包括子 classes。在子 class 中将方法声明为 private
没有意义,因此是不允许的。
现在,如果您担心子class重写方法,您可以将方法声明为 final
以防止这种情况发生:
class Config extends Module{
@Override
public final void onEnable(){}
//Whatever
}
我有一个名为 Module
的 Class,它有一个方法 onEnable();
现在我有一个名为 Config
的 class 并且想要制作 onEnable();
方法 private
因为有一个预定义的动作和一个 class 扩展 Config
不应该允许改变行为。
有什么办法吗?
例子
class Module{
public void onEnable(){
}
}
一个class扩展模块允许使用onEnable
:
class HelloWorldModule{
@Override
public void onEnable(){
System.out.println("Hello, World!");
}
}
现在配置 Class,我希望 onEnable
是私有的,这样扩展配置的 Classes 就不能了!覆盖 onEnable
:
class Config{
@Override
private void onEnable(){
}
}
所以现在,扩展 Config
的名为 ProgrammConfig
的 class 不能覆盖 onEnable
.
但是,这不起作用,因为您无法将 public
方法重写为 private
方法。
你不能使用继承来解决这个问题。如果 Config
是 Module
的子 class,那么它 必须 提供 Module
的所有功能(至多)相同访问限制。将 subclass 视为 superclass 的特殊版本:它可以做 superclass 可以做的一切,可能更多,但绝不会更少。
您仍然可以根据需要实施 Config
class。只需跳过 subclassing,而是使用 Module
类型的私有字段,如下所示:
class Config {
private Module module;
public Config() {
module = new Module();
}
public int SomeFunctionFromModuleYouWantToExpose() {
return module.SomeFunctionFromModuleYouWantToExpose();
}
// ...
}
通过将方法声明为 public
,您是说应该可以在此 class 的每个实例上调用所述方法,包括子 classes。在子 class 中将方法声明为 private
没有意义,因此是不允许的。
现在,如果您担心子class重写方法,您可以将方法声明为 final
以防止这种情况发生:
class Config extends Module{
@Override
public final void onEnable(){}
//Whatever
}