【发布时间】:2019-07-12 01:12:22
【问题描述】:
我正在分解一个类以允许重用、不同的信息隐藏实现等。
原来是:
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() 声明为public,但这并不正确,因为它仅供SubOuter 及其子类使用。
怎么会?受innerDoSomething() 保护的访问不应该被SubOuter 禁止和访问吗?
【问题讨论】:
-
为什么都是
static? -
在这种情况下,我相信编译器实际上将 SuperInner 指定为 SubInner 的外部父级,它正在从 SubOuter 中剥离范围.如果您删除了扩展程序,它应该可以工作。
-
我还想补充一点,这不遵循任何官方的 OOP 分解模式。你的方法非常奇怪。我相信可能有更合适的方法来做你想做的事。
-
@Dylan 示例代码中根本没有显示分解模式。我只需要分解 Outer 和 Inner,因为它们都包含需要由不同的子类以不同方式指定的细节。
标签: java inner-classes protected