9

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

foo();
super.foo();

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

4

8 回答 8

8

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

希望这可以说清楚。

于 2012-10-03T13:48:03.547 回答
6

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

因为一目了然的方法调用来自哪里

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

于 2012-10-03T13:51:36.937 回答
4

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

于 2012-10-03T13:47:29.897 回答
4

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

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

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

于 2012-10-03T13:50:42.220 回答
2

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

于 2012-10-03T14:02:08.237 回答
1

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

于 2012-10-03T13:47:48.720 回答
1

这取决于。

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

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

于 2012-10-03T13:50:57.957 回答
1

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

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

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

于 2012-10-03T13:56:35.483 回答