11

我真的对人们在重写方法中使用 super 的方式感到困惑。就像有什么不同

  @Override
  protected void onResume() {
    // some logic here 
    super.onResume();
  }

  @Override
  protected void onResume() {
    super.onResume();
    // some logic here 
  }

最后我们调用 super() 的时候,它会不会做任何预处理,因为一般我们会调用 super 来初始化父构造函数。

两种性能的任何差异。

4

5 回答 5

21

首先,在方法super()中根本不允许使用plain - 仅在构造函数中。我假设您实际上是指适当的方法。super.someMethod()

最后我们调用 super() 时,它会不会做任何预处理,因为一般我们调用 super 来初始化父构造函数。

在方法中使用super与在构造函数中使用有些不同。

在构造函数中,super(or this)必须是第一个语句(如果存在,则隐含super())并且它只能调用构造函数。

在一个方法中, usingsuper.someMethod()只是调用someMethod. 您可以从任何方法调用它(您当时不必重写someMethod),并且可以在方法中的任何位置调用它。它在您调用它时被调用,它只是避免了对覆盖实现的多态调用。

所以基本上你在哪里 - 以及是否 - 你称之为取决于你想要的效果。在某些情况下,您可能希望在您自己的自定义行为之前调用同一方法的超类实现,而在某些情况下,您可能希望在您自己的自定义行为之后调用它。

于 2013-06-26T20:13:17.693 回答
2

这实际上取决于该方法实现的逻辑。有时首先调用它,有时在最后调用,有时从不调用。例如,如果超类方法的某些计算非常重要,那么它会首先被调用。或者如果在子类方法中尝试计算但没有好的结果(结果为空)尝试在子类方法上进行。这个问题真的没有很好的答案,除了它真的取决于。


示例 1:

从对象推断时间Date并将其返回到 UI 以显示的标签提供程序:

public class TimeLabelProvider {
    public String getText(Date element) {
        //extrapolate time from the element
        return time;
    }
}

从对象推断日期和时间Date并将其返回到 UI 以显示的标签提供程序:

public class DateTimeLabelProvider extends TimeLabelProvider {
    @Override 
    public String getText(Date element) {
         //extrapolate date from the element
         String date = ...

         //now get time string. We don't need to repeat logic, 
         //its already implemented in super method!
         String time = super.getText(element);
         return date + " " + time;
    }
}

示例 2:

如果您的项目对 UI 元素有较深的类层次结构,例如

DropDownField extends TextField extends Field extends AbstractField

现在,每个类都在字段中添加了一些 UI 元素,例如,DropDownField在字段的右侧添加了一个菜单和一个小箭头,TextField添加了一个验证器,AbstractTextField添加了一个白色块来写入文本,等等......您将不得不像这样进行多级处置:

public class DropDownField extends TextField {

    @Override
    public void dispose() {
        menu.dispose();
        arrow.dispose();
        //let text field dispose of its elements
        super.dispose();
    }
}
于 2013-06-26T20:13:37.833 回答
1

看看 swt 对话框的 okPressed() 方法。通常人们会在对话框上覆盖 okPressed 来做一些想要的工作。super.okPressed() 通常让对话框什么都不做。因此,在您完成所有工作后,它最终会被调用。

public void okPressed()
{
   ///Do your work
   super.okPressed()
}
于 2013-06-26T20:16:03.330 回答
1

至于是在第一行还是在方法的最后一行回调超级方法……这取决于超级方法的语义。换句话说,除了查看该方法的文档(或代码)之外,没有其他方法可以知道。在某些情况下,您根本不想调用 super 方法。

你似乎在问onResume()。虽然文档没有说,但我一直使用的模式是在第一行回调超级方法。因为onPause(),我在最后一行回电。这个想法是超级方法包装您的自定义暂停/恢复逻辑......

super on resume
custom on resume
...
custom on pause
super on pause
于 2013-06-26T21:00:11.773 回答
0

关键字 super 是一种在专用类中调用父类行为的方法。

在构造函数中,调用

super(args)

让您选择应该使用哪个父类的构造函数。

在一个方法中,调用

super.parentMethod(args)

让你调用父类的行为,即使当前类覆盖了 parentMethod。通常,它将用于在父类之前或之后添加一些逻辑。

打电话

super();

in 方法不会编译,因为您在方法中使用了构造函数超级语法。

于 2013-06-26T20:18:33.943 回答