在创建子类时,其内部类将始终从父类继承,而不是子类。
class Create
class Draft < self
# code
class Update < Create
# Update::Draft's is implicitly created, but its parent is Create, not `Update`. Why?
Create::Draft.superclass
将返回Create
。没关系。但Update::Draft.superclass
也将返回Create
。我希望Update::Draft
继承Update
类。
答案 0 :(得分:1)
Ruby没有嵌套类,这也意味着它没有虚拟类(显然,因为虚拟类是嵌套类的特例)。如果你想使用虚拟类,你需要使用支持它的语言,例如Beta,gBeta或newspeak(我不知道其他任何人)。
由于虚拟类是虚拟的嵌套类,因此您可以使用方法(嵌套在类和虚拟内部)返回类(在Ruby中为第一类对象,因此可以返回)在Ruby中对它们进行排序。通过方法)。
但仍然没有解决在类声明期间仅对一次评估超类表达式的问题,而不是每次为每个消息发送都评估。同样,newspeak执行此操作,因此您可以使用它。
您的代码还有其他问题。例如,你想要一个Update::Draft
类神奇地出现。如果你想要第四堂课,你需要定义第四堂课。没有第四堂课。甚至没有第四个常数。它只是不断的查找规则。 Update
没有名为Draft
的常量,因此Ruby继续查看词法封闭类(Object
),它也没有名为{{1}的常量所以它继续查看超类并在那里找到它。没有出现。它总是在那里。
由于只有一个类,它不能在不同的时间拥有不同的超类,你真的需要类。
您基本上想要的是类层次结构继承,这是虚拟类启用的功能。 newspeak的解析器组合库是使用类层次结构继承的一个很好的例子。