在不需要时使用超级有什么危害吗?

时间:2012-10-03 13:45:51

标签: java coding-style

此消息严格适用于Java。如果方法在超类中,则可以通过两种方式调用该方法:

foo();
super.foo();

总是做后者是否有任何伤害?作为一种编码风格,我更喜欢后者,因为一眼就能看出方法调用的来源。在任何情况下,“超级”将不存在或不做我认为会做的事情吗?

8 个答案:

答案 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()调用该功能,那么您可以阻止自己以后覆盖该函数,如果您不想覆盖该函数,那么也许您不应该使用继承作为访问此功能的方法。

我听说过的一个设计原则是“赞成合成而不是继承”,其原因是你的代码变得更灵活,而不是继承。如果你没有获得继承的积极方面(能够覆盖函数),那么可能不使用继承更明智。