从子类方法保护超类方法

时间:2011-03-05 13:53:28

标签: java class inheritance methods

一个类是否有可能只能通过它的对象调用并为子类对象隐藏?例如:

class ClassOne {
    ... // attributes

    public void doSomething() { ... }
}

class ClassTwo extends ClassOne {
    ... // attributes and methods
}

ClassOne c1 = new ClassOne();
c1.doSomething(); // ok to call

ClassTwo c2 = new ClassTwo();
c2.doSomething(); // forbidden

我知道这似乎是遗传的奇怪想法,但它有可能吗?

PS:这个问题的目的只是为了更多地了解OO编程的继承。

3 个答案:

答案 0 :(得分:5)

这样做会破坏继承,这是不可能的。想想

ClassOne c2 = new ClassTwo();
c2.doSomething(); // what to do?

这必须起作用,因为ClassTwo is a ClassOne。编辑:至少是必须编译,如果方法被覆盖并做其他事情取决于您的设计。但是你不能让编译器在这上面产生错误。

答案 1 :(得分:3)

由于doSomething在classOne中声明,因此它将在任何子类中可用。您无法隐藏它或降低其可见性(将其设为私有或受保护)。由于ClassTwo是ClassOne,它可以完成ClassOne可以做的所有事情。

你最接近的是:

class ClassTwo extends ClassOne {
   public void doSomething() { throw new UnsupportedOperationException(); }
}

并不是你想要的。

如果您处于需要做到最好的情况,可能需要将类层次结构重新考虑为具有doSomething方法的类的类型以及不具有

的类型
public class Parent { ... }
public class ClassOne extends Parent {
   public void doSomething(){ ... }
}
public class ClassTwo extends Parent { 
}

或将doSomething放在界面中。

答案 2 :(得分:0)

可能是我误解了你,但你为什么不把你的方法设为私有或包可见?