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