此消息严格适用于Java。如果方法在超类中,则可以通过两种方式调用该方法:
foo();
super.foo();
总是做后者是否有任何伤害?作为一种编码风格,我更喜欢后者,因为一眼就能看出方法调用的来源。在任何情况下,“超级”将不存在或不做我认为会做的事情吗?
答案 0 :(得分:8)
我认为您可能遇到的唯一伤害就是当您想要使用多态时,如果您调用foo()
并且某些子类重写foo,那么效果将与调用super.foo()
时的效果不同,基本上,这取决于你如何设计代码以及用途。
希望这说清楚。
答案 1 :(得分:6)
作为一般规则,您只应在类super.foo()
方法中使用foo()
。总的来说,不这样做违背了OOP的思想。
因为一目了然的方法调用来自
在OOP中你不应该知道方法调用“来自”的位置。如果您的程序(或您的想法)依赖于此,您可能会遇到麻烦(当有人决定覆盖该方法时,可能会遇到实际问题)。必须从外部看到方法myobject.foo()
作为myobject类的方法;如果该方法实际上在其父级的具体类中实现,则无关紧要。
答案 2 :(得分:4)
我认为做前者有更多的危害,因为它不是一个超类的方法。
答案 3 :(得分:4)
是的,这基本上打破了继承链。
您不允许继承机制选择即使在从此派生的类中使用的函数。
super.foo()
的要点是允许您仅在需要时指定,并且您知道其他任何行为都不会好。
答案 4 :(得分:2)
如果您不想明确避免在子类中使用重写方法,那么您不应该使用super。 如果以后某人想要覆盖子类中的方法,那么总是使用super可能会造成麻烦。
答案 5 :(得分:1)
如果您打算在超类上调用该方法,而不是在没有foo()
的情况下调用super.
,那么这是一种更好的方法。如果有人在子类中覆盖foo()
,则超级调用会调用与之前相同的方法,但省略super
现在将调用覆盖的方法。这取决于你对该方法调用的意图。
答案 6 :(得分:1)
取决于。
如果foo()
被声明为final
,则根本没有任何区别。如果foo()
不声明为final
,则子类可以覆盖超类中foo()
的声明,并完全更改预期的行为。
如果您创建自己的班级final
,则可以防止它被分类,并确保保留原始意图。
答案 7 :(得分:1)
我会说这可能表明你应该再考虑一下你的设计。
如果您总是通过super.foo()调用该功能,那么您可以阻止自己以后覆盖该函数,如果您不想覆盖该函数,那么也许您不应该使用继承作为访问此功能的方法。
我听说过的一个设计原则是“赞成合成而不是继承”,其原因是你的代码变得更灵活,而不是继承。如果你没有获得继承的积极方面(能够覆盖函数),那么可能不使用继承更明智。