向Kotlin中父类的方法添加一些命令

向Kotlin中父类的方法添加一些命令,kotlin,Kotlin,假设我有文件A.kt,其内容如下: open class EchoWebSocketListener(instance: MainActivity?) : WebSocketListener() { open fun ReceiveString(message: String?) { println("foo") } override fun onMessage(webSocket: WebSocket?

假设我有文件A.kt,其内容如下:

open class EchoWebSocketListener(instance: MainActivity?) : WebSocketListener() {
        open fun ReceiveString(message: String?) {
            println("foo")
        }
        override fun onMessage(webSocket: WebSocket?, text: String?) {
            output("Receiving : " + text!!)
            ReceiveString(text)
        }
}
class NewMessage(instance: MainActivity?) : WebSocket.EchoWebSocketListener(instance) {
    override fun ReceiveString(message: String?) {
        println(message)
    }
}
我有文件B.kt,内容如下:

open class EchoWebSocketListener(instance: MainActivity?) : WebSocketListener() {
        open fun ReceiveString(message: String?) {
            println("foo")
        }
        override fun onMessage(webSocket: WebSocket?, text: String?) {
            output("Receiving : " + text!!)
            ReceiveString(text)
        }
}
class NewMessage(instance: MainActivity?) : WebSocket.EchoWebSocketListener(instance) {
    override fun ReceiveString(message: String?) {
        println(message)
    }
}
我想要的不是重写ReceiveString(),我需要更改它,以便在收到消息后打印“foo”和消息。任何帮助都将不胜感激

编辑:

我正在努力使它更简单。假设我有一个.kt文件,其中包含:

class foo() {
  fun a() {
    println("foo")
  }

  //Assume this function is unchangeable and is running in a loop
  fun b() {
    fun a()
  }
}

现在我需要一个()打印“foo”和“bar”。但是我必须从文件B.tk中动态地向它添加println(“bar”)。解决方案是什么?

以下是编写函数的方法:

class NewMessage(instance: MainActivity?) : WebSocket.EchoWebSocketListener(instance) {
    override fun ReceiveString(message: String?) {
        super.ReceiveString()
        print(message)
    }
}

您还可以在

中找到一个例子,首先,如果您希望子类有
ReceiveString()
执行与其父类不同的操作,则必须重写该方法。这似乎是你理解的最大问题

人们在第一次重写时遇到的一个常见问题是,他们试图在父构造(
init
)中开始使用该函数/成员,认为它已经被某个子类重写了构造是按顺序进行的,因此重写也会按顺序进行。父级被创建,然后子级覆盖它需要的内容。如果需要子功能,最早使用它的时间是在子初始化期间

现在尽可能简单地回答你的问题:

我需要更改它,以便在收到消息后打印“foo”和 消息任何帮助都将不胜感激

解决方案:

class NewMessage(instance: MainActivity?) : WebSocket.EchoWebSocketListener(instance) {
    override fun ReceiveString(message: String?) {
        println("foo")
        println(message)
    }
}
如果您希望它是“做家长做的事,然后打印消息”:


就像Sgh提到的。我几乎可以肯定,压倒一切就是你想要的。如果没有,请将您的问题代码编辑为一个最小的完整示例。如果解决方案给您带来错误,那么我们将不知道原因,除非您告诉我们为什么它会出现问题。

覆盖正在改变它。您想调用
super.foo
的事实并不会改变您正在覆盖它的事实谢谢您的回答。我已经读过这个文档,但是重写这个函数需要在onMessage()函数中初始化它,这似乎是不可能的。问题是,重写函数不会更改父类中的父方法。它只是创建了一个新的扩展方法。“但是重写这样的函数需要在onMessage()函数中初始化它”——这是什么意思?您不能在其他函数中初始化函数,我的意思是我必须再次将新的扩展方法放在onMessage()中。这似乎是不可能的好吧,也许我不得不选择肮脏的选项!Looper.prepare()…您不需要。这就是覆盖的意义所在。假设有东西在
NewMessage
实例上调用
onMessage()
NewMessage
不会覆盖
onMessage()
,因此它会返回到超类
EchoWebSocketListener
中的实现。当该实现调用
onMessage()
时,它将调用
NewMessage
中定义的覆盖版本。(在C++术语中,java/kutLin中的所有方法调用都是虚拟的)。从另一个角度看,任何时候在类中调用方法时,实际上都可以调用子类中的重写版本。