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

前端之家收集整理的这篇文章主要介绍了是否可以隐藏或降低对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 {

}

有没有办法完成这个?

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

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

基类是管理数据库处理部分的基表类.在其中包含相当多的功能,这对所有表类型是常见的,因为一旦它们在数据库中,它们就变得统一起来.

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

顶级类是特定于表,并且只能以父类可以理解的方式初始化表的布局.基类的用户也不需要查看或访问中间类的数据库特定功能.实质上,我想将这些函数显示在基类之上,而不是别的.

我问,因为尽管我发布的代码是非法的,可能还有其他一些手段来完成同样的结局.我问是否有.

也许隐藏是错误的方式来说明这一点 – 我真正需要做的是将一些基础类的私有功能暴露给层次结构中的一级.隐藏将会实现这一点 – 但我可以看到隐藏是一个问题.有另一种方法吗?

解决方法

我认为你提出的问题的性质暴露了你的对象模型的概念问题.在实际上你应该做的是描述“有一个”或“使用”关系时,你正在努力将各种各样的责任描述为“是一种”关系.您希望从一个子类隐藏基类功能的事实告诉我,这个问题实际上并不映射到三层继承树上.

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

你说:

The base class is the base table class
managing the database handling part of
it. There is a fair amount of
functionality contained in it that is
common to all table types – as once
they are in the database they become
uniform.

这可能更清楚,但是听起来我们有一个类需要管理数据库连接和通用数据库操作.在Single Responsibility之后,我想我们在这里完成.您不需要扩展此类,您需要将其交给需要使用其功能的类.

The middle class is specific to the
kind of table in the file being
parsed,and has the table parsing and
import logic. It needs access to some
of the base class’s database access
functions.

这里的“中产阶级”听起来有点像Data Mapper.这个类不需要扩展上一个类,它需要拥有它的引用,也许注入到构造函数或一个设置器作为接口.

The top level class is specific to the
table and does nothing more than
initialize the table’s layout in a way
the parent classes can understand.
Also users of the base class do not
need to see or access the database
specific functions which the middle
class do. In essence,I want to reveal
these functions only to one level
above the base class and no one else.

我不清楚为什么一个高级别的类似乎有数据库模式的知识(至少这是短语“初始化表的布局”对我来说),但是再一次,如果前两个类之间的关系是encapsulation (“has a”/”uses a”) instead of inheritance (“is a”)我不认为这是一个问题.

猜你在找的Java相关文章