Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Eclipse插件生成的代码中super()调用的位置可靠吗?_Android_Eclipse_Adt_Super - Fatal编程技术网

Android Eclipse插件生成的代码中super()调用的位置可靠吗?

Android Eclipse插件生成的代码中super()调用的位置可靠吗?,android,eclipse,adt,super,Android,Eclipse,Adt,Super,在许多Android方法中,尤其是构造函数和重写方法,您应该甚至必须使用super()调用父类方法。当您使用EclipseSource>Override/Implemental方法…时,您可以从带有TODO标记的模板中获得如下代码: public MyCanvas(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } @Ov

在许多Android方法中,尤其是构造函数和重写方法,您应该甚至必须使用super()调用父类方法。当您使用EclipseSource>Override/Implemental方法…时,您可以从带有TODO标记的模板中获得如下代码:

public MyCanvas(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}


@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub      
    super.onDraw(canvas);
} 
我不清楚超类在每种情况下都做了什么,所以我总是在//TODO标记的确切位置插入代码。在本例中,我将在构造函数中的代码之前和onDraw()中的代码之后调用super()

我是否可以始终依赖生成代码中的这些代码插入位置?何时调用super()有简单的规则/解释吗

检查文档中的非构造函数重写。有时你想叫超级,有时不想

我是否可以始终依赖生成代码中的这些代码插入位置

不,有时您不想调用
super.method
。有时你想先打电话,有时在最后一个地方打电话,等等,这要看情况而定。但是,我说的是方法,没有构造函数

何时调用super()有简单的规则/解释吗

您必须始终将所有
super
作为前面的答案。唯一不调用super的情况是当super类的构造函数没有参数时;在这种情况下,编译器将为您放置
super

我不太清楚超类在每种情况下都做了什么,所以我总是在//TODO标记的确切位置插入代码

如果您有疑问(我说的是超级方法),您可以随时查看源代码。谷歌代码搜索是一个很好的资源。然后您可以决定是将代码放在超级方法之前还是之后;甚至,根本不要使用超级方法

请记住,在编译时不放置超级方法是有效的。但是,android上的某些方法除非调用super方法(例如,
Activity
类的
onResume
方法),否则无法工作

此外,有时您将决定是否在运行时运行super方法。考虑这个经典的例子:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if( KeyEvent.KEYCODE_BACK == event.getKeyCode() ){
        return true;
    }
    return super.onKeyUp(keyCode, event);
}

如果用户按下back键,则不会调用super方法。如果用户没有,您可以将工作委托给super方法。

这是一个好问题。不幸的是,这方面没有简单的规则。您需要知道超类实现的作用。有时(如在
View.onDraw()
中),超类实现什么都不做;调用super()既无害又没有必要。在其他情况下(例如
Activity.onCreate()
),超类实现执行必须在子类处理的某个点执行的关键操作。有时调用super()时发生的事情应该在子类中的任何处理之前发生,有时在其他点发生。有时,您希望用自己的处理完全替换超类处理,在这种情况下,您根本不调用super()。您可以在子类逻辑中的任意点(甚至多点)调用超类版本

在构造函数中,调用超类构造函数(如果存在)必须是方法中的第一件事。如果没有,编译器会自动在超类中插入对无参数构造函数的调用。(如果超类没有无参数构造函数,或者子类无法访问它,编译器将生成错误。)

如果文档没有提供足够的信息,那么您必须查看源代码。Android代码可用(姜饼版本)。API代码位于
core

编辑该代码在git.kernel.org上不再可用。以下是您可以浏览代码的两个其他位置:


主要代码在repository Platform>Frameworks>Base

中,而我认为问题已经得到了回答-谢谢-我不喜欢结果。考虑到API设计和职责分离,我认为应用程序程序员不必查看API的源代码来了解发生了什么。我想知道是否以及何时调用super(),查看API文档。也许应该努力准确地记录这些方法在API类中的作用。例如,如果View.onDraw()什么都不做,出于性能原因,我宁愿不做,但如果我这样做了,我就不是舒尔。有了适当的文档,您永远不必查看源代码来确定是否(或何时)调用super()。不幸的是,Android API中的许多方法都缺乏文档(或者根本没有文档)。此外,我们大多数人很久以前就学会了:唯一好的文档是代码本身。至少Android可以使用这些代码(与其他一些API不同,我不会提及)。超类必须首先在
onRestoreInstanceState>onStop、onRestart、onStart
中调用,最后必须在
onDestroy、onPause、onSaveInstanceState、onResume
中调用