java - 如何调用派生类(子类)的重写方法?
问题描述
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:测试消息
我正在观察一个线程,如果收到一条新消息,我将不得不在 UI 上显示它
我在基本活动中观察这个线程,因为在每个子活动(21 个活动)中观察,这将是高度冗余且难以管理.我没有将父方法抽象化以便调用子方法,因为这样每个活动(BaseActivity 的子)都必须实现该方法。我希望方法留在基类中,调用后会有通用操作,然后如果有该方法的任何实现(覆盖),则该数据将传递给子类
现在,我不知道这怎么可能,如果在 Java、Kotlin 的上下文中有可能,请指导。
帮助表示赞赏。:)
解决方案
JVM默认调用你的子覆盖方法,被覆盖的方法可以决定是否调用超级方法,这就是继承的工作原理。但是为了让你的被覆盖的方法被调用,你必须确保你已经覆盖了它!
onNewMessage
在您的代码中,您尚未open
在BaseActivity
. 因此编译器假定该方法为 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")
}
因此可以使用相同的签名覆盖它。
推荐阅读
- php - Json 以 [ 开头,使用 json_encode 时,它在 magento2 中以 " 开头,使用 php7.1
- android - 调试应用程序安装设备后无法安装发布应用程序
- javascript - js通过数组对象过滤数组对象
- ios - Apple Store 预览和截图
- c# - 在磁盘根目录使用 nlog 没有日志
- ruby - rails generate ckeditor:install --orm=active_record --backend=active_storag 不起作用 Rails 5
- java - 异常 org.apache.poi.poifs.filesystem.OfficeXmlFileException - apache.Poi 4.0.0
- javascript - Vue $on 事件在第一次使用事件总线时不会触发
- docker - 如何创建一个包含标准 python 库的 docker 文件以供使用
- reactjs - 如何检查变量是否在 React 中具有某些符号?