在 Java 中重载和隐藏方法

2022-09-03 18:11:23

我有一个带有公共方法的抽象类BaseClass:insert()

public abstract class BaseClass {

 public void insert(Object object) {
  // Do something
 }

}

它由许多其他类扩展。但是,对于其中一些类,该方法必须具有其他参数,以便我用所需的参数重载基类的方法,而不是重写它,例如:insert()

public class SampleClass extends BaseClass {

 public void insert(Object object, Long param){
  // Do Something
 }

}

现在,如果我实例化 SampleClass 类,我有两种方法:insert()

SampleClass sampleClass = new SampleClass();
sampleClass.insert(Object object);
sampleClass.insert(Object object, Long param);

我想做的是隐藏基类中定义的方法,以便只有重载可见:insert()

SampleClass sampleClass = new SampleClass();
sampleClass.insert(Object object, Long param);

这可以在OOP中完成吗?


答案 1

没有办法隐藏该方法。您可以执行以下操作:

@Override
public void insert(Object ob) {
  throw new UnsupportedOperationException("not supported");
}

但仅此而已。

基类创建协定。所有子类都受该合约的约束。可以这样想:

BaseObject b = new SomeObjectWithoutInsert();
b.insert(...);

该代码如何知道它没有方法?它不能。insert(Object)

您的问题听起来像是设计问题。有问题的类不应该从有问题的基类继承,或者基类不应该有该方法。也许你可以从该类中取出,将其移动到子类,并有需要扩展它的类和需要扩展基对象的不同子类的类。insert()insert(Object)insert(Object, Object)


答案 2

我不相信有一种干净的方法可以在Java中完全隐藏继承的方法。

在这种情况下,如果你绝对不能支持这种方法,我可能会在子类中将该方法标记为@Obsolete,并让它抛出一个NotImplementedException(或者Java中任何等效的异常),以阻止人们使用它。

最后,如果您继承了一个对子类没有意义的方法,则可能真的不应该从该基类继承。也可能是基类设计不佳或包含太多行为,但可能值得考虑您的类层次结构。另一个要查看的途径可能是组合,其中您的类具有曾经是基类的私有实例,您可以通过将它们包装在自己的方法中来选择要公开的方法。(编辑:如果基类是抽象的,则组合可能不是一个选项...)