java - 当我从抽象父类(super class) Activity 调用子类的方法时,发生了什么?

标签 java android inheritance casting

我想从我的父类(super class)(它扩展了 Activity )中调用子类函数。但是,我找不到子类的实例,所以我只是天真地尝试向下转换我的抽象父类(super class)并调用它的方法来看看会发生什么。我没想到这会起作用 - 父类(super class)怎么知道要在哪个实例上调用该方法?

public abstract class RootActivity extends Activity{
    private flag someCondition;

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
        //... 
    }
    // ... 

    public void startJob(JobAction.Id jobaction){
        Log.d("Zlatan", "started a job");
        if (!jobaction.someCondition){
            return;
        }else{
            ((SpecificJob) this).dontDelete(); //<--- What have I done?
            startSomeLongAsynchronousJob(someCondition);
            Log.d("Zlatan", "calling finish");
            finish();
        }

    }
    // ...
    public void someOtherFunction(){
        finish();
    }
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event){
        //...
        startJob(JobAction.SOMEENUM);  //Startjob is being called in the superclass
    }
}
}

我这里有一个子类。该 Activity 是由另一个 Activity 启动的,我也在这里包含了 list fragment 。

public class SpecificJob extends SomeClassThatExtendsRootActivity{
    //SomeClassThatExtendsRootActivity extends RootActivity - I've ommitted it
    private boolean flag = false;
    @Override
    public void onCreate(Bundle bundle){
        super.onCreate(bundle);
        //...
    }
    // ... some code ...
    public void dontDelete(){ //Not static
        flag = true;
        Log.d("Zlatan", "I set flag"); //This doesn't appear in log
    }

    @Override 
    public void onDestroy(){
        Log.d("Zlatan", "When finishing, flag is now " + flag);
    }
}

<activity
        android:name=".SpecificJob"
        android:label="@string/TXT_BOOKMARKS"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/stuff"
        android:launchMode="singleTask"
        android:windowSoftInputMode="stateHidden"
        android:taskAffinity=".SpecificJob">
        <intent-filter>
            <action android:name="com.me.feature.SOME_WORKFLOW" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <meta-data
            android:name="concurrency"
            android:value="DEFAULT_CONCURRENCES|printer"
            />
    </activity>

令我惊讶的是,没有出现错误或崩溃。我的结果是

D/Zlatan started a job
D/Zlatan calling finish
D/Zlatan﹕ When finishing, flag is now false

我没有看到我在 SpecificJob.dontDelete() 中编写的日志。我的问题是

1) 这在运行时做了什么?为什么我看不到“我设置了标志”,为什么它没有崩溃?

2) 如何最好地从 RootActivity 调用 SpecificJob 中的函数?

最佳答案

直到运行时才会检查转换,并且当您从 RootActivity 继承 SpecificJob 并仅在 SpecificJob 上调用 startJob() 时,生成的对象仍然是 SpecificJob 类型。这意味着可以毫无问题地进行 Actor 阵容。如果您要扩展 RootActivity 并尝试在这个新类上调用 startJob() ,它将不起作用。

您不应该从父类(super class)调用子类。父类(super class)不应该知道它是如何扩展的。可能有更好的方法,你为什么要这样做?

更新:因此,将 RootActivity 以及继承它的任何类将使用的所有清理代码放入 RootActivity 的 onDestroy 方法中。

public abstract class RootActivity extends Activity{
    @Override 
    public void onDestroy(){
        // All cleanup code common to inherited classes goes here
    }
}

然后在 SpecificJob 中调用 super.onDestroy,然后调用 SpecificJob 特有的任何代码。

public class SpecificJob extends SomeClassThatExtendsRootActivity{
    @Override 
    public void onDestroy(){
        super.onDestroy();
        // All cleanup code unique to this class goes here
    }    

}

关于java - 当我从抽象父类(super class) Activity 调用子类的方法时,发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29614315/

相关文章:

java - 从本地触发远程服务器上的快照

java - 如何禁用 Android Camera2 API 中的所有自动功能

c++ - 谁能帮我解决以下编译错误——关于数组的两个实现?

inheritance - 我怎样才能在 Perl 6 中重新启用一个对象?

java - 显示 ArrayList 中对象的值(来自子类)(基于父类(super class))

java - 如何在音频处理中模拟 Vinyl Scratch 效果?

java - 重构复杂的 if 条件

java - Hibernate逆向工程,在Spring MVC项目中使用

android - 如何准确使用Ratingbar?

android - 显示自定义 ListView 的默认选择颜色