首页 > 解决方案 > 如何调用派生类(子类)的重写方法?

问题描述

abstract class BaseActivity : AppCompatActivity() {
    funNewMessageObserver() {
        observable.observe(this, {
            onNewMessage(it) //where `it` is a string    
        }  
    }
    
    fun onNewMessage(msg : String){
        Log.e(TAG, "New Message Parent Method invoked: msg: $msg")  
    }
} //end of base activity

class ChatActivity : BaseActivity() {
    override fun onNewMessage(msg : String) {
        Log.e(TAG, "New Message Child Method invoked: msg: $msg")
    }
}

我得到什么输出:

调用的新消息父方法:msg:测试消息

我想要什么:

调用的新消息子方法:msg:测试消息

现在,我不知道这怎么可能,如果在 Java、Kotlin 的上下文中有可能,请指导。

帮助表示赞赏。:)

标签: javaandroidkotlinoopobject-oriented-analysis

解决方案


JVM默认调用你的子覆盖方法,被覆盖的方法可以决定是否调用超级方法,这就是继承的工作原理。但是为了让你的被覆盖的方法被调用,你必须确保你已经覆盖了它

onNewMessage在您的代码中,您尚未openBaseActivity. 因此编译器假定该方法为 final 并且不允许覆盖它,所以替换

fun onNewMessage(msg : String) {
    Log.e(TAG, "New Message Parent Method invoked: msg: $msg")  
}

open fun onNewMessage(msg : String) {
    Log.e(TAG, "New Message Parent Method invoked: msg: $msg")  
}

因此可以使用相同的签名覆盖它。


推荐阅读