我在Smalltalk反射做研究,我想知道是否有可能延长单个对象一样,将例如在Ruby中是可能的。 有了这个,我的意思是一个选择,只有特定的对象响应。
这里描述的是我的意思Ruby代码。 为了澄清:在Ruby中这种开放此对象的虚类,并用新的定义进行了扩展。 这里的关键部分是没有什么变化的类定义!
o = Object.new
o.instance_eval {def foo;puts "foo";end}
o.foo #=> "foo"
#however this will fail:
m = Object.new
m.foo #=> NoMethod error
更具体地讲,我的问题是,这是否是可能的标准佳乐/菲罗或其它Smalltalk的实现方式中,不增加大量的结构或代码以允许此。 因此,与存在于Smalltalk的正反射功能等字样。
举个例子,就可以添加方法,删除方法,编译新的代码为一类,改变实例变量和公正的东西,但我还没有找到一种方法来扩展一个对象。
Test addInstVarNamed: #var.
Test compile: 'var ^var'.
t:= Test new.
Test instVarNames.
t instVarNamed: #var put: 666.
t var. #=> 666
如果答案是否定的,那么解释原因。 我不是在寻找解决这个问题,而是理解为什么它不是在Smalltalk。
在Smalltalk中没有内置在这样做实例特定的行为方式。 Smalltalk中坚持的原则,每个对象都属于一个类和它的行为和状态形状取决于类。 这就是为什么你可以很容易地改变类(添加研究所瓦尔,编译新的方法,等等),但是这意味着改变行为,其所有实例。 有,但是,不同的方法(根据Smalltalk的味道)为实现特定实例的行为,例如轻量级的类,这里的想法是创建一个特殊的(轻量级)类特定的实例,并取代原有的类定制一。 因此,你必须为每个“特殊”情况下的特殊类。 据我所知在Digitalk圣调度机制是一种更灵活一点,并可以轻松地实现基于实例的行为(见第4链接)。 我会在这里留下一些链接,你可能会发现有用:
- 在Smalltalk-80反光设施
- 阶级斗争:类与原型
- Smalltalk的每日09年6月4日:实例特定的行为
- 对于工作Smalltalker实例特定行为
- 评估消息传递控制技术在Smalltalk
HTH
编辑: 发表埃尔南(“调试对象”被欣克尔,琼斯生)的链接就是我所指的一个和找不到。
在Smalltalk中有实例具体行为主要涉及更改指针类和原始通话。 在“调试对象”的文章由鲍勃·欣克尔,赵薇琼斯和Ralph E.约翰逊,发表在Smalltalk的报告,第2卷第9,1993年7月- 8月包含所有的解释。
我已经移植由鲍勃·欣克尔的VisualWorks中2.0在1995年发布的版本的原始轻量级类代码。 该VisualWorks中源代码包含在一个名为“ParameterizedCompiler”,“断点”和“轻量级”三包分。 通过具有分开的和可重复使用的功能的愿望产生这种划分的原因。 所有这些都在OOP期刊单独的文章。
我佳乐/菲罗端口包含一个“浏览器实例”的基础上, OmniBrowser (多文档在这里 )的框架,它可以让你浏览和修改过的经典Smalltalk的浏览器用户界面添加轻量级行为的实例。 它会工作在最新佳乐4.x的版本,很少或根本没有力气。 不幸的是菲罗的基础设施,从版本<= 1.2实质性的改变,因此,它可能需要一些工作,以解决它最新版本。
在VisualWorks中,由于在VisualWorks中GUI从2.0到7.3的深刻变化,大部分管理轻便类的工具不包括在内。 如果有人有兴趣,我可以上传包裹的VW 7.3
一个基本的脚本来测试轻量级类特点是:
| aDate |
aDate := Date today.
aDate becomeLightweight.
aDate dispatchingClass
compile: 'day ^42'
notifying: nil
ifFail: [self error].
aDate day inspect
佳乐电子玩具大量利用了特定对象的行为和状态的。 这是作为“uniclasses”。 当您创建一个电子玩具对象(Player类的实例)的脚本,那么该对象的类将被更改为“佑霖”,也就是玩家的独特的子类,它可以有自己的方法(对应于电子玩具脚本)和实例变量(对应于电子玩具用户变量)。
其它基于佳乐项目使用“匿名” uniclasses,未列为其超类的子类。 这意味着他们几乎不可见的,因为他们没有在系统浏览器中显示出来,例如(而eToys的风格uniclasses不要在浏览器中显示)。
一个运动课一直致力于为菲罗Smalltalk中被称为Bifrost新的反射API。 您可以检查的页面Bifrost项目 。
他的方法的核心推动特定实例adapations。 一切都发生在以适应他们结合元对象定期对象。 较低级别的元对象可以由到更高级别的,粗粒度的,元对象定义明智适应,例如谱元对象,将测量目标对象在每次调用所花费的时间。
正如@ewernli指出Bifrost基本上使得Smalltalk中以对象为中心的反射系统。 所有反射改变在对象而不是具有一个类的混合机构的第一目标。 你仍然可以做所有的传统课堂反思,但是,对象为中心的反思之上。 我认为,这是有关这一新方法的是一个数字的,我们发现,提高我们如何发展并感觉到直播系统应用:
对象为中心的调试完全改变了我们通过关注对象,并允许开发者保持与现场的对象进行交互,而不是插入在源代码级条件断点调试方式。
人才是重用的组合的动力单元,如性状但对象。 还有更多的应用程序。
在Ruby中,据我所知,法词库重视的对象。
在Smalltalk中,该法词库绑定到Class
对象,因此,在香草Smalltalk的形象,你不能写这样eigenclass-事情。
话虽如此,有几个原型库: 这个问题的答案,提了不少。