【问题标题】:Is there any harm in using super when not needed?在不需要时使用 super 有什么害处吗?
【发布时间】:2012-10-03 13:45:50
【问题描述】:

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

foo();
super.foo();

总是做后者有什么坏处吗?作为一种编码风格,我更喜欢后者,因为方法调用的来源一目了然。在任何情况下“超级”将不存在或不做我认为它会做的事情?

【问题讨论】:

  • 这不是风格问题,而是目的问题。 foo() 将指向 this.foo() 或 super.foo() 如果这个类没有覆盖 foo();然而 super.foo() 将永远是 super.foo()。希望能解决这个问题。
  • 是的,总是使用 super 是有害的。使用 super 意味着调用超类方法——即使它现在或将来某个时候被层次结构中的 this 或其他类覆盖。

标签: java coding-style


【解决方案1】:

我认为你可能唯一的伤害是当你想使用多态性时,如果你调用 foo() 并且某些子类覆盖了 foo,那么效果会与调用 super.foo() 不同,基本上,这取决于关于您如何设计代码以及用于什么目的。

希望这说明清楚。

【讨论】:

    【解决方案2】:

    作为一般规则,您应该只在您的类foo() 方法中使用super.foo()。否则,通常会违背 OOP 思维。

    因为方法调用的来源一目了然

    在 OOP 中,您不应该想知道方法调用的“来源”。如果您的程序(或您的想法)依赖于此,那么您就有潜在的麻烦(并且当有人决定覆盖该方法时可能会遇到实际麻烦)。方法myobject.foo()必须从外部看为myobject类的方法;该方法是否实际在其父类的具体类中实现并不重要。

    【讨论】:

      【解决方案3】:

      我会说做前者的危害更大,因为不清楚它是否是超类的方法。

      【讨论】:

        【解决方案4】:

        是的,这基本上打破了继承链。

        您不允许继承机制选择要使用的函数,即使在派生自该函数的类中也是如此。

        super.foo() 的意义在于允许您仅在需要时指定,并且您知道没有其他行为会是好的。

        【讨论】:

          【解决方案5】:

          如果您不想明确避免在子类中使用覆盖方法,则不应使用 super。 如果以后有人想要覆盖子类中的方法,总是使用 super 可能会导致麻烦。

          【讨论】:

            【解决方案6】:

            如果您打算在超类上调用方法,而不是在没有super. 的情况下调用foo(),这是一种更好的方法。如果有人在子类中覆盖了foo(),那么超级调用确实会调用与以前相同的方法,但省略super 现在将调用被覆盖的方法。这取决于您对该方法调用的意图。

            【讨论】:

              【解决方案7】:

              视情况而定。

              如果将foo() 声明为final,则完全没有区别。如果foo()声明为final,则子类可以覆盖超类中foo() 的声明,并完全改变预期的行为。

              如果您创建自己的类final,您可以防止它被子类化,并确保保留原始意图。

              【讨论】:

                【解决方案8】:

                我会说这可能表明你应该重新考虑你的设计。

                如果您总是通过 super.foo() 调用该功能,那么您以后会阻止自己重写该函数,并且如果您不想拥有重写该函数的能力,那么也许您不应该使用继承作为访问此功能的一种方法。

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-06-23
                  • 2021-03-29
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-12-19
                  • 2011-01-07
                  相关资源
                  最近更新 更多