从超类调用方法

时间:2014-01-22 13:48:39

标签: tcl

我目前正在使用TclOO在Tcl中编写IRC库。

现在我想实现输出队列,因为如果你一次发送太多文本,大多数IRC服务器都不喜欢它。

超类有一个方法send,只需将内容写入套接字:

oo::class ::irc::core {
    method send {text} {
        variable socket
        puts $socket $text
    }
    # ...
}

为了实现队列,我决定扩展我的核心类并覆盖send

oo::class ::irc::queue {
    method send {text} {
        # For this example, we just delay it.
        after 50 [list [namespace which my] DrainQueue $text]
    }
    method DrainQueue {text} {
        # Now call [send] from ::irc::core
        my send $text
    }
}

这显然不起作用。

TL; DR 在Java中,我使用super.Method(),TclOO的等价物是什么?

2 个答案:

答案 0 :(得分:1)

脚本级别没有任何内容允许您使用超类视图调用任意方法。使用协程构造代码可能更好,这样就可以延迟代码的执行。然后你可以这样写:

method send {text} {
    after 50 [info coroutine]
    yield
    next $text
}

替代

要编写没有这个的东西,也许最简单的方法是将实际的发送者放在超类中的另一个私有方法中,并从public方法转发给它。然后你可以根据需要覆盖和调用。

oo::class ::irc::core {
    method Send {text} {
        variable socket
        puts $socket $text
    }
    forward send my Send
    # ...
}

oo::class ::irc::queue {
    method send {text} {
        after 50 [list [namespace which my] DrainQueue $text]
    }
    method DrainQueue {text} {
        my Send $text
    }
}   

真实的方式(针对C黑客)

C API 可以通过向对象添加method name mapper来支持这种行为,但这在功能上不会暴露给脚本([incr Tcl] 4除外)和它的缺点是必然会限制合法方法名称的空间(目前在很大程度上是无限的,但我保留了一些用于未来扩展的东西,例如多字名称)。我猜你不会立即想到方法名称映射作为处理这类问题的方法,但它是该机制的预期用途。

将映射器API暴露给脚本也许应该在我的议程上更高;到目前为止,它已经走了很长的路(在子方法和垃圾收集之下...)

答案 1 :(得分:-1)

你有没有想过使用next
也许这会有所帮助(TCL 8.6),如果我明白你想要什么,接下来应该完成工作。
看到微小的代码下面:
oo::class create one {
method moo { } {
puts "I am one"
}
}
oo::class create two {
superclass one
method moo { } {
puts "I am two"
next
}
}
two create foo
foo moo exit

输出为:I am two I am one
下一个调用超类方法moo