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)扩展基础对象的不同子类的类.
我不相信有一种干净的方法来完全隐藏Java中的继承方法.
在这种情况下,如果你绝对不能支持那种方法,我可能会在子类中将该方法标记为@Obsolete,并让它抛出NotImplementedException(或Java中的等效异常),以阻止人们使用它.
最后,如果你继承了一个对你的子类没有意义的方法,那么你真的不应该继承那个基类.它也可能是基类设计不当或包含太多行为,但可能值得考虑您的类层次结构.另一个要查看的路径可能是组合,其中您的类具有以前作为基类的私有实例,您可以通过将它们包装在您自己的方法中来选择要公开的方法.(编辑:如果基类是抽象的,组合可能不是一个选项......)
| 归档时间: |
|
| 查看次数: |
11995 次 |
| 最近记录: |