【发布时间】:2019-12-11 19:33:09
【问题描述】:
我正在编写一个名为“MyObject”的类。 类方法之一是:
addTo: aCodeString assertType: aTypeCollection
当使用aCodeString 调用该方法时,我想(在运行时)向“MyObject”类添加一个新方法,aCodeString 是它的源代码,并将类型检查代码注入源代码。
例如,如果我这样调用addTo: assertType::
a := MyObject new.
a addTo: 'foo: a boo:b baz: c
^(a*b+c)'
assertType: #(SmallInteger SmallInteger SmallInteger).
我希望我以后可以写:
answer := (a foo: 2 boo: 5 baz: 10).
并在answer 中获得 20。
如果我写:
a foo: 'someString' boo: 5 baz: 10.
我得到了正确的消息,因为 'someString' 不是 SmallInteger。
我知道如何编写类型检查代码,并且我知道要在运行时将方法添加到类中,我可以使用 Behavior 类中的“编译”方法。
问题是我想在源代码中添加类型检查代码。
我对所有的 squeak 类都不太熟悉,所以我不确定我是否宁愿将aCodeString 编辑为addTo: assertType: 中的字符串,然后使用compile:(而且我不知道如何这样做),或者有一种方法可以将代码注入到 Behavior 类或其他 squeak 类中的现有方法中。
所以基本上,我要问的是如何将字符串注入现有字符串或将代码注入现有方法。
【问题讨论】:
-
虽然将代码注入方法很有趣,但我认为基于类进行类型检查并没有什么好处。通过阻碍多态性应用,这违背了所有 Smalltalk 实践
-
请不要忘记接受您的回答。如果它没有回答您的问题,请在您的问题或答案下方发表评论。