如何调用派生的 class (child class) 的重写方法?
How to call the overridden method of a derived class (child class)?
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")
}
}
我得到什么输出:
新消息Parent调用的方法:消息:测试消息
我要什么out:
新消息Child调用的方法:消息:测试消息
我正在观察一个帖子,如果收到新消息,我必须在UI
上显示
我在 base activity 中观察这个线程,因为在每个 child activity(21 个活动)中观察,它将是高度冗余且难以管理的。
我没有将 parent 方法抽象化以便调用 child 的方法,因为这样每个 activity (child BaseActivity 的)将必须实现该方法。
我希望该方法保留在基础 class 中,调用后将进行通用操作,然后将数据传递给 child class 如果它有该方法的任何实现(覆盖)
现在,我不知道这怎么可能,如果在 Java 的上下文中有可能,Kotlin,请指导。
感谢您的帮助。 :)
JVM默认调用你的子重写方法,重写方法可以决定是否调用super方法,这就是继承的原理。但是要调用覆盖的方法,您必须确保已 覆盖它!
在您的代码中,您没有在 BaseActivity
中声明 onNewMessage
方法 open
。因此编译器假定该方法是最终的并且不允许覆盖它,所以替换
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")
}
因此可以使用相同的签名覆盖它。
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")
}
}
我得到什么输出:
新消息Parent调用的方法:消息:测试消息
我要什么out:
新消息Child调用的方法:消息:测试消息
我正在观察一个帖子,如果收到新消息,我必须在UI
上显示 我在 base activity 中观察这个线程,因为在每个 child activity(21 个活动)中观察,它将是高度冗余且难以管理的。我没有将 parent 方法抽象化以便调用 child 的方法,因为这样每个 activity (child BaseActivity 的)将必须实现该方法。 我希望该方法保留在基础 class 中,调用后将进行通用操作,然后将数据传递给 child class 如果它有该方法的任何实现(覆盖)
现在,我不知道这怎么可能,如果在 Java 的上下文中有可能,Kotlin,请指导。
感谢您的帮助。 :)
JVM默认调用你的子重写方法,重写方法可以决定是否调用super方法,这就是继承的原理。但是要调用覆盖的方法,您必须确保已 覆盖它!
在您的代码中,您没有在 BaseActivity
中声明 onNewMessage
方法 open
。因此编译器假定该方法是最终的并且不允许覆盖它,所以替换
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")
}
因此可以使用相同的签名覆盖它。