是否可以从子类中的超类中删除一个方法?

Ape*_*eus 3 java inheritance

我有一个像这样的超类:

public abstract class Foo {

    //some method here    

    public void aMethod() {
        //some code
    }
}
Run Code Online (Sandbox Code Playgroud)

和2个子类BarOne,BarTwo并扩展了Foo类.

BarOne,一切都很正常,但在BarTwo,我想@Deprecated aMethod()

确切地说:我的意思是隐藏它,而不是因为隐私原因而弃用.有没有更好的方法而不是覆盖方法?

Gho*_*ica 7

即使技术上可行,它在概念上也是错误的.因为这是对Liskov替代原则的概念违反.

你知道,继承不仅仅是放入A extends B你的源代码.我们的想法是基类中的方法定义了一个契约.使用这些方法的代码不需要关心这样的方法在基类中实现 - 或在子类中重写的事实.

你基本上是这样说的:我想x()在基类上有方法,但是我想表达x()在子类上已经弃用的方法.这意味着代码调用x()应该只在它调用基类实例上的方法时才这样做.

因此,这里的答案是:甚至不要考虑做那样的事情.在所有继承级别上,某个方法"可以被调用",或者不是.没有必要仅对儿童班级施加这种限制.

因此,这里真正的答案:退一步,并考虑为什么你有这样的想法走了过来.然后寻找解决该问题的其他方法.

鉴于隐藏它的评论:同样的故事.技术上:你无法隐藏方法.因为,正如调用时所说的那样foo.bar()是某个基类foo实例的有效语句 - 当foo碰巧是子类的实例时,它也需要是一个有效的语句.

唯一合法的事情是:

  • 基本方法上有javadoc,解释子类可能会覆盖无法执行任何操作的方法(或抛出异常)
  • 那么,你的子类方法可以做任何需要的事情

  • @AndyTurner真的.当合同说"你没有合同"时,那么,你没有合同. (2认同)

Max*_*mer 5

你在描述这样的事情:

            ___________
           | class Foo |
           |           |
           | aMethod() |
           |___________|
            /         \
           /           \
 _________/____       __\___________
| class BarOne |     | class BarTwo |
|              |     |              |
|  inherits    |     |  hides       |
|  aMethod()   |     |  aMethod()   |
|______________|     |______________|
Run Code Online (Sandbox Code Playgroud)

您不能也不应该这样做,如GhostCats答案中所述.

但是,你可以做的是这样的:

            ___________
           | class Baz |
           |           |
           |___________|
            /         \
           /           \
 _________/____       __\___________
| class Foo    |     | class BarTwo |
|              |     |              |
|  aMethod()   |     |______________|
|______________|
       |
       |
 ______|_______
| class BarOne |
|              | 
|  inherits    |
|  aMethod()   |
|______________|
Run Code Online (Sandbox Code Playgroud)

Baz然后将拥有Foo以前拥有的所有代码,除了aMethod().Foo只想补充aMethod(),并成为所有是要继承aMethod(),同时Baz所有的类不希望继承aMethod().

  • 是的,我在记事本xD中手动输入了这些 (3认同)
  • 不错的,特别是那可爱的ascii艺术.你手动绘制这些吗? (2认同)