是否可以在Java中隐藏或降低对继承方法的访问?

我有一个类结构,我希望基类中的一些方法可以从直接从基类派生的类访问,但不能从派生类派生的类访问。根据Java语言规范,可以重写继承方法的访问规范,以使它们更加公开,但不能更加私密。例如,这是我需要做的要点,但是非法的:

// Defines myMethod
public class Base {
    protected void myMethod() {}
}

// Uses myMethod and then hides it.
public class DerivedOne extends Base {
    @Override
    private void myMethod();
}

// can't access myMethod.
public class DerivedTwo extends DerivedOne {

}

有没有办法做到这一点?

编辑以解释为什么我想这样做:

在这种情况下,类结构是数据处理和导入结构。它读取并分析充满表格数据的文本文件,然后将其存储在数据库中。

基类是管理数据库处理部分的基表类。其中包含相当多的功能是所有表类型通用的 - 因为一旦它们进入数据库,它们就会变得统一。

中产阶级特定于文件中要解析的表的类型,并具有表解析和导入逻辑。它需要访问基类的某些数据库访问函数。

顶级类特定于表,除了以父类可以理解的方式初始化表的布局之外,不执行任何操作。此外,基类的用户不需要查看或访问中产阶级所做的数据库特定功能。从本质上讲,我只想将这些函数揭示到基类之上的一个级别,而不是其他任何一个级别。

我问是因为,尽管我作为示例发布的代码是非法的,但可能还有其他一些方法可以实现相同的目的。我问是否有。

也许隐藏是表达这一点的错误方式 - 我真正需要做的是向层次结构中一级的类公开一些应该私有于基类的功能。隐藏将实现这一目标 - 但我可以看到隐藏将是一个问题。有没有另一种方法可以做到这一点?


答案 1

我认为你所提出的问题的本质暴露了你的对象模型的概念问题。你试图将各种单独的责任描述为“是”关系,而实际上你应该做的是描述“有一个”或“使用一个”关系。您希望对子类隐藏基类功能这一事实告诉我,这个问题实际上并没有映射到三层继承树上。

这听起来像是在描述一个经典的ORM问题。让我们再看一遍,看看我们是否可以将其重新映射到严格的“是”继承以外的其他概念上,因为我真的认为你的问题不是技术性的,而是概念性的:

你说:

基类是管理数据库处理部分的基表类。其中包含相当多的功能是所有表类型通用的 - 因为一旦它们进入数据库,它们就会变得统一。

这可能更清楚,但听起来我们有一个类需要管理数据库连接和常见的数据库操作。遵循单一责任,我认为我们在这里完成了。您不需要扩展此类,您需要将其交给需要使用其功能的类。

中产阶级特定于文件中要解析的表的类型,并具有表解析和导入逻辑。它需要访问基类的某些数据库访问函数。

这里的“中产阶级”听起来有点像数据映射器。这个类不需要扩展前一个类,它需要拥有对它的引用,可能作为接口注入构造函数或 setter 上。

顶级类特定于表,除了以父类可以理解的方式初始化表的布局之外,不执行任何操作。此外,基类的用户不需要查看或访问中产阶级所做的数据库特定功能。从本质上讲,我只想将这些函数揭示到基类之上的一个级别,而不是其他任何一个级别。

我不清楚为什么高级类似乎对数据库模式有所了解(至少这是短语“初始化表的布局”对我的建议),但是,如果前两个类之间的关系是封装(“has a”/“uses a”)而不是继承(“is a”),我不认为这会是一个问题。


答案 2

不。我不确定为什么你会引用规范,然后问是否有任何方法可以做与规范所说的相反的事情......

也许如果你解释为什么你想这样做,你可以得到一些关于如何做的建议。


推荐