向Kotlin中父类的方法添加一些命令
假设我有文件A.kt,其内容如下:向Kotlin中父类的方法添加一些命令,kotlin,Kotlin,假设我有文件A.kt,其内容如下: open class EchoWebSocketListener(instance: MainActivity?) : WebSocketListener() { open fun ReceiveString(message: String?) { println("foo") } override fun onMessage(webSocket: WebSocket?
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中的所有方法调用都是虚拟的)。从另一个角度看,任何时候在类中调用方法时,实际上都可以调用子类中的重写版本。