【问题标题】:How to call the overridden method of a derived class (child class)?如何调用派生类(子类)的重写方法?
【发布时间】:2021-10-09 08:02:31
【问题描述】:
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 的上下文中有可能,请指导。

感谢您的帮助。 :)

【问题讨论】:

    标签: java android kotlin oop object-oriented-analysis


    【解决方案1】:

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

    在您的代码中,您没有在BaseActivity 中声明您的onNewMessage 方法open。因此编译器假定该方法为 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")  
    }
    

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

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2018-01-18
      相关资源
      最近更新 更多