我有一个像这样的超类:
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()
确切地说:我的意思是隐藏它,而不是因为隐私原因而弃用.有没有更好的方法而不是覆盖方法?
即使技术上可行,它在概念上也是错误的.因为这是对Liskov替代原则的概念违反.
你知道,继承不仅仅是放入A extends B你的源代码.我们的想法是基类中的方法定义了一个契约.使用这些方法的代码不需要关心这样的方法在基类中实现 - 或在子类中重写的事实.
你基本上是这样说的:我想x()在基类上有方法,但是我想表达x()在子类上已经弃用的方法.这意味着代码调用x()应该只在它调用基类实例上的方法时才这样做.
因此,这里的答案是:甚至不要考虑做那样的事情.在所有继承级别上,某个方法"可以被调用",或者不是.没有必要仅对儿童班级施加这种限制.
因此,这里真正的答案:退一步,并考虑为什么你有这样的想法走了过来.然后寻找解决该问题的其他方法.
鉴于隐藏它的评论:同样的故事.技术上:你无法隐藏方法.因为,正如调用时所说的那样foo.bar()是某个基类foo实例的有效语句 - 当foo碰巧是子类的实例时,它也需要是一个有效的语句.
唯一合法的事情是:
你在描述这样的事情:
___________
| 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().