当前位置: 首页 > 面试题库 >

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

池俊茂
2023-03-14
问题内容

我有一个类结构,我希望可以从直接从基类派生的类访问基类中的某些方法,但不能从派生类派生的类访问这些方法。根据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 {

}

有什么办法可以做到这一点?

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

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

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

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

顶级类特定于表,并且仅以父类可以理解的方式初始化表的布局。同样,基类的用户不需要查看或访问中层类所具有的数据库特定功能。从本质上讲,我只想在基类之上的一个层次上展示这些功能,而在其他任何层次上都没有。

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

可能隐藏起来是错误的表达方式-我真正需要做的是将某些功能(这些功能应该是基类专有的)公开给层次结构中上一级的类。隐藏可以实现这一点-
但我可以看到隐藏将是一个问题。还有另一种方法吗?


问题答案:

我认为问题的本质就象您提出的那样,暴露了对象模型的概念性问题。当您实际上应该在描述“具有”或“使用”关系时,您试图将各种不同的职责描述为“是”关系。您想从子类中隐藏基类功能的事实告诉我,这个问题实际上并没有映射到三层继承树上。

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

你说:

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

这可能更清楚,但是听起来我们有一个类需要管理数据库连接和常见的数据库操作。遵循单一职责后,我认为我们已经完成了。你并不需要
扩展 这个类,你需要 用手 它的一类需要使用它的功能。

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

这里的“中产阶级”听起来有点像Data
Mapper
。此类不需要 扩展
前一类,它需要拥有对它的引用,可以将其注入构造函数或设置器中作为接口。

顶级类特定于表,并且仅以父类可以理解的方式初始化表的布局。同样,基类的用户不需要查看或访问中层类所具有的数据库特定功能。从本质上讲,我只想在基类之上的一个层次上展示这些功能,而在其他任何层次上都没有。

我不清楚为什么高级类似乎了解db模式(至少这是短语“初始化表的布局”对我的建议),但是还是要重申一下,如果前两个类之间的关系是封装的(“有一个”
/“使用一个”)而不是继承(“是一个”),我认为这不是问题。



 类似资料:
  • 问题内容: 继续这个问题:为什么不能降低Java子类中方法的可见性? 我需要创建几乎与class相同的类,除了不能做某些可以做的事情。 作为一个懒惰的程序员,我试图继承,只是为了迎接无法降低方法可视性的错误。h!.. 现在是供应商提供的API,我的意图是封装此API,以便更易于使用。 我想知道解决此问题的最佳实践是什么? 问题答案: 两种选择: 如果您需要与保持相同的接口(以便客户端代码可以使用这

  • 问题内容: 我收到此编译器错误: 您不能降低继承方法的可见性。 我有以下代码 在此,父类具有公开的方法,并由私有的子类覆盖。现在,编译器抛出了我无法降低可见度的错误。从技术上讲,每当我创建一个分配给类型父对象的对象时,由于该方法被覆盖,因此将始终调用TestClass的func(),那么为什么还要注意可见性呢?这个错误背后的原因是什么?有人可以清楚地解释我吗? 问题答案: 这是因为子类有知名度的方

  • 问题内容: 我正在阅读Khalid Mughal 撰写的Java™SCJP认证程序员指南。 在“继承”一章中,它说明了 成员的继承与声明的可访问性紧密相关。如果超类成员可以通过子类中的简单名称来访问(不使用任何其他语法,如super),则该成员被视为继承的 它还提到静态方法不是继承的。但是下面的代码完全可以: 我如何直接在课堂上使用?甚至更多,也可以。 这本书的解释仅适用于实例方法吗? 问题答案:

  • 问题内容: 给定以下代码,我有一个问题: 我的问题是粗体字。我的理解是,对于要编译的代码,只需要满足这些类处于相同的层次结构中,并因此可以起作用即可(在树上隐式强制转换,在树上隐式强制转换)。每当我遇到ClassCastException时,是因为引用指向树上的一个对象,例如,指向B类型的对象的B类型的引用。 问题所在的行似乎是指向类型A的对象的类型A的引用。强制转换为(B)显然是导致ClassC

  • 问题内容: 如果HTML元素样式的属性设置为,它是否仍可单击? 当该属性设置为时,该元素甚至都不是DOM树的一部分,因此这不是问题。但是我想知道一个元素是否仍然响应鼠标事件。 问题答案: 随着它 是 仍然DOM的一部分。只是没有在视口中渲染。 至于点击元素,则 不会 触发事件。

  • 问题内容: 我正在使用Selenium RC自动执行一些浏览器操作,但我希望浏览器不可见。这可能吗?怎么样?selenium网格呢?我也可以隐藏Selenium RC窗口吗? 问题答案: 有几种选择: 您可以使用Selenium Grid,以便在完全不同的计算机(或虚拟机)上打开浏览器,然后如果您想查看浏览器,则可以通过VNC或远程桌面连接连接到该计算机。另外,还有一个选择:如果在该远程服务器上运