我希望创建一个有用的基本Java类,其中包含一些受保护的方法和挂钩,以便可以轻松实现子类。
但是,我希望此类仅可用于派生子类,但不能作为依赖项使用。
原因是为了防止一些初级/粗心的开发人员将其代码耦合到该基类。
例如,如果我的基类称为BaseActivity.java,则任何人都可以创建自己的
public class MyNewActivity extends BaseActivity
但是没有人可以使用字段或方法签名直接引用BaseActivity,例如,不应这样做:
public void doSomethingOnBaseActivity(BaseActivity activity);
private BaseActivity someField;
public BaseActivity getActivity();
有什么办法可以在Java中完成这种限制?
也许在科特林这可能吗?
编辑:
这不是Kotlin: Can an abstract super class have an abstract constructor?的重复项。
我希望防止对基类的依赖,而不仅仅是实例化。 “摘要”在这里无济于事。
最佳答案
不,这是不可能的。这个答案对所有类型都是正确的,无论抽象与否,接口或类。当您处于某个类的范围内(例如同一包),并且该类未密封时,则该范围内的每个人都可以继承它。只要您在范围内,就可以引用此类型。这就是访问修饰符的重点。允许扩展类型但不引用它是没有意义的。这与概念相矛盾。你为什么想这么做?无论如何,您都不能删除该基类,因为这会破坏所有继承者的代码。允许扩展但不允许引用是没有意义的。这是什么原因。也许有另一种方式可以实现您的目标。有人从类型继承的那一刻就创建了依赖关系。这种依赖关系称为继承。子类型是超类型。您无法在编译器中隐藏这一事实。
如果要忽略依赖项,但要重用代码或提供代码模板,则不要使用类型。您可以使用文件模板或代码生成器来生成可重用的代码(如代码片段)。