// 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”)我不认为这是一个问题.