【发布时间】:2011-05-19 21:07:46
【问题描述】:
我尝试在 Ruby 中扩展现有的 Singleton 类,例如 Matrix 类。
我的第一个 quick&dirty 解决方案是猴子补丁(重新打开类并扩展功能)。
但我认为,猴子补丁一般都不好,特别是如果有人试图覆盖核心类的基本方法,如字符串、整数等......
下一步是找出如何获得具有新名称(如 MatrixExt)的 Matrix 类的真实硬拷贝,该名称表现为独立的单例。
MatrixExt = Matrix
没有完成这项工作,因为它导致:
MatrixExt.scalar(2,0)
=> Matrix[[0, 0], [0, 0]]
所以我只能为同一个单例获得多个名称。不,我想要的。
clone 和 dup 方法的结果相同。
类继承也不起作用:
class MatrixExt < Matrix
# patches ...
end
MatrixExt.scalar(2,0)
=> Matrix[[0, 0], [0, 0]]
这是最令人困惑的部分,因为在自定义类中可能会获得继承类。 (那么,为什么 core/std lib 类的工作方式不同?)
我目前的解决方案是有一个带有扩展名的模块,然后在初始化后显式使用.extend,例如:
m = Matrix.scalar(2,0).extend(MatrixExtModule)
暂时没关系,但我的问题是:
还有其他解决方案吗?如果有,该怎么做?
(不,复制matrix.rb当然不是好办法。;o)
我做错了什么或我的想法有问题?
在此先感谢您提供任何解决方案和/或启发灵感!
【问题讨论】:
标签: ruby inheritance matrix singleton