我正在分解一个类以允许重用,不同的信息隐藏实现等。
是:
public class Outer
{
public static class Inner
{
// ...
protected static void innerDoSomething()
{
// ...
}
}
public outerDoSomething()
{
//...
Inner.innerDoSomething();
//...
}
}
一切都很好,因为外部的Outer类被允许访问嵌套的Inner类的受保护成员。
但是尝试分解:
public class SuperOuter
{
public static class SuperInner
{
// ...
protected static void innerDoSomething()
{
// ...
}
}
// ...
}
public class SubOuter extends SuperOuter
{
public static class SubInner extends SuperInner
{
// ...
protected static void innerDoSomethingElse()
{
// ...
}
}
public outerDoSomething()
{
//...
SubInner.innerDoSomethingElse(); // OK
SubInner.innerDoSomething(); // Error: cannnot access!
//...
}
}
innerDoSomething()不可访问,即使SubOuter可以访问SubInner的受保护成员,并且SuperInner的所有受保护成员也应该是SubInner受保护接口的一部分。
使其生效的唯一方法似乎是为每种方法添加显式委派,例如:
public static class SubInner extends SuperInner
{
// ...
protected static void innerDoSomethingElse()
{
// ...
}
protected static void innerDoSomething()
{
SuperInner.innerDoSomething();
}
}
这很烦人,容易出错并且浪费时间。我很想只将innerDoSomething()声明为公共对象,但这并不是真的正确,因为它只能由SubOuter及其子类使用。
为什么? SubOuter是否应该禁止并保护innerDoSomething()保护的访问权限?
答案 0 :(得分:1)
不能通过变量引用从其他程序包访问受保护的方法。 如果SuperOuter和SubOuter这两个类位于同一程序包中,它将起作用。