【问题标题】:Protecting superclass method from subclass method保护超类方法免受子类方法的影响
【发布时间】:2011-07-09 10:05:15
【问题描述】:

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

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 编程的继承。

【问题讨论】:

    标签: java class inheritance methods


    【解决方案1】:

    这会破坏继承是不可能的,你的权利。想想

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

    这必须工作,因为 ClassTwo is a ClassOne。编辑:至少必须编译,如果方法被覆盖并执行其他操作取决于您的设计。但是你不能让编译器对此产生错误。

    【讨论】:

    • 谢谢。这正是我所坚持的。
    【解决方案2】:

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

    你能来的最接近的是:

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

    这并不完全符合您的要求。

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

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

    或将 doSomething 放入接口中。

    【讨论】:

    • 谢谢。其实我不需要实现。我只是对这种行为感到好奇。
    【解决方案3】:

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

    【讨论】:

    • 如果方法被标记为私有,我们不能使用超类引用来调用方法(除非代码在同一个类中)。
    • 但在问题中没有关于通过超类变量调用的消息。我想这只是示例中的错误。
    猜你喜欢
    • 2010-10-01
    • 2015-10-01
    • 2017-12-09
    • 2018-07-15
    • 2011-05-18
    • 2011-10-09
    • 2011-11-30
    • 2023-01-27
    相关资源
    最近更新 更多