单例类和元类
Posted
技术标签:
【中文标题】单例类和元类【英文标题】:Singleton class and meta class 【发布时间】:2014-08-05 07:30:21 【问题描述】:我知道单例类是什么。单例类用于保存为对象定义的单例方法。元类和单例类是一样的吗?谁能解释一下什么是元类?关于元类的一些信息给出了单例类的例子。两者是同一事物还是相互关联?
【问题讨论】:
【参考方案1】:在书 - The Ruby Programming Language 第 257 页中,Matz 解释了您的问题如下:
对象的单例方法是与该对象关联的匿名eigenclass 的实例方法。 “Eigen”是一个德语单词,意思是(大致)“自我”、“自己的”、“特定的”或“特征的”。 eigenclass 也称为 单例类或(不太常见的)元类。 “eigenclass”一词在 Ruby 社区内并未被统一接受,但我们将在本书中使用它。
【讨论】:
只有引文中的最后两句与问题相关。【参考方案2】:我认为元类是一些人将单例类称为非官方的方式。除了单例类,eigenclass 是它的另一个官方名称。
【讨论】:
【参考方案3】:长期以来,现在被称为“单例类”的东西没有正式名称。人们称它为各种不同的东西,包括但不限于:
单例类 特征类 元类 虚拟类 鬼类 影子类这些都是指同一个东西。
但是,其中一些已经具有确定的含义。例如,“元类”在 OO 中,特别是在 Smalltalk 中已经有了一个含义,它的含义与它曾经在 Ruby 中的使用方式不同,这会导致混淆,尤其是考虑到 Ruby 与 Smalltalk 的密切关系。
同样,“虚拟类”有不同的含义。 (此外,该术语也用于 YARV 源代码中的第三个概念。)
【讨论】:
大部分我都看过。虚拟课堂意味着不同的东西。在哪里可以阅读元类和虚拟类之间的区别? 在 YARV C 源代码中,“虚拟类”是指属于方法查找链的类,但不被视为对象的类。这些是单例类和包含类(将模块混合到类中时生成的代理类)。更一般地说,虚拟类是可以在子类中覆盖的嵌套类(类似于虚拟方法是可以在子类中覆盖的类的成员)。 Beta(Simula 的继承者)和 Newspeak(Smalltalk 的后裔)有虚拟课程。他们也计划用于 Scala,但被放弃了。 因此,在 Ruby 中,术语“虚拟类”已经被错误地使用,然后开始以不同的错误方式使用。 所以,在 Ruby 级别它只是一个module
?
@DarekNędza:虚拟类是嵌套类的特例。 Ruby 两者都没有。不过,您可以通过一个返回类的方法来模拟虚拟类,然后可以在子类中覆盖该类。以上是关于单例类和元类的主要内容,如果未能解决你的问题,请参考以下文章