一个类是否有可能只能通过它的对象调用并为子类对象隐藏?例如:
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编程的继承。
答案 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)
可能是我误解了你,但你为什么不把你的方法设为私有或包可见?