Dav*_*gan 6 java inheritance packages
我有一个关于偷偷摸摸地获取访问包访问成员的问题.具体来说,我想扩展一个类 - 让我们称之为com.acme.Foo- 来添加一些功能.这是纯粹的补充:Foo只需委托超类的方法就可以支持所有当前的方法.但是,没有可访问的构造函数Foo,所以我无法扩展类,我的实现不会通过"isA"测试成为一个Foo.没有表达的接口Foo- 我可以使用而不是继承.
这是我想到的一个偷偷摸摸的想法:Foo有一个包访问构造函数,所以为什么不在com.acme我的源文件夹中创建一个包并InheritableFoo在该包中创建一个类:
package com.acme;
public class InheritableFoo extends Foo {
public InheritableFoo() {
super();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以Foo通过扩展实现我的扩展InheritableFoo,因为那个DOES有一个可访问的构造函数.
这种感觉都是错误的,并且有点不道德:我不尊重原始程序员在决定不公开构造函数时做出的决定Foo.但情况可能就是他们只是采用了"拒绝一切,直到有理由"的方法.无论哪种方式,这个想法有什么根本的错误吗?如果我走这条路,我将来会给自己带来问题,如果是的话,为什么?
您是正确的,您可以将自己的类“潜入”另一个包并访问包限制元素。
然而,只有当作者将com.acme.foo其代码作为源代码或未密封的包分发时,才会出现这种情况。如果这个包的作者将其作为密封罐子分发(我相信这很常见),您的方法将不再有效。
JAR 文件中的包可以选择密封,这意味着该包中定义的所有类必须存档在同一个 JAR 文件中。