Java中的重载和隐藏方法

Mar*_*ark 14 java oop overloading

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

public abstract class BaseClass {

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

}
Run Code Online (Sandbox Code Playgroud)

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

public class SampleClass extends BaseClass {

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

}
Run Code Online (Sandbox Code Playgroud)

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

SampleClass sampleClass = new SampleClass();
sampleClass.insert(Object object);
sampleClass.insert(Object object, Long param);
Run Code Online (Sandbox Code Playgroud)

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

SampleClass sampleClass = new SampleClass();
sampleClass.insert(Object object, Long param);
Run Code Online (Sandbox Code Playgroud)

这可以在OOP中完成吗?

cle*_*tus 21

无法隐藏该方法.你可以这样做:

@Override
public void insert(Object ob) {
  throw new UnsupportedOperationException("not supported");
}
Run Code Online (Sandbox Code Playgroud)

但就是这样.

基类创建契约.所有子类都受该合约的约束.以这种方式思考:

BaseObject b = new SomeObjectWithoutInsert();
b.insert(...);
Run Code Online (Sandbox Code Playgroud)

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

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


And*_*ite 6

我不相信有一种干净的方法来完全隐藏Java中的继承方法.

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

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