使超类变量对 TCL OO 中的子项只读

Making superclass variables read-only to children in TCL OO

让我有一个 class foo,带有一个变量 bar。现在...我想要如果有一个 class moo,它有 class foo 作为超级 class,我希望任何尝试写入,或者更好的是,甚至参考直接bar会报错。这可以避免有人使用我的代码(可以编译为字节码)的情况,而不是通过拥有自己的同名变量来覆盖

TclOO 根本不支持这个概念。 类 不是 TclOO 中的安全边界,就像名称空间不是普通 Tcl 中的安全边界一样(TclOO 对象实际上只是奇特的名称空间)。 Tcl 的安全边界在解释器之间,在 Tcl 脚本级别和(通常)C 实现级别之间。我们正在考虑为 Tcl 8.7 添加“私有”实例变量,但即使是那些也不是真正私有的;如果您知道如何操作,它们的名称仍然是可预测的(并且它们可以从 class 外部访问;这对于将变量与第三方代码(如 Tk)一起使用时很重要)。重申一下:classes 不是安全边界.

如果你有一些东西必须锁在看不见的地方,用 C 实现它是最简单的。你可以插入 methods implemented in C into TclOO (applying whatever controls you can think of) and those methods can use the (C level only) metadata mechanism 来创建他们可以使用的实例附加存储。所有回调都已到位,可以在正确的时间正确地进行删除。 C 中的方法并不比 C 中的命令复杂多少;函数回调签名有点不同,用法也有点复杂(因为方法上还有其他标准操作,例如复制它们)但是如果你能做一个,你也可以弄清楚如何做另一个。