【发布时间】:2016-06-12 02:34:16
【问题描述】:
我正在使用 Pharo 5.0。在某些情况下,我在现有的 Pharo 类(例如、DBXTalk/Garage 或 Regex-Core 中的某些东西)中发现了限制或可能存在错误。我希望能够修改存在于我自己项目之外的类中的一个或一组选择器,并将其作为我的包的一部分。
我找到了一些关于如何在外部类中创建 new 选择器并将其移动到我的包中的说明(例如,如tutorial 所示) .这很酷。但在某些情况下,我实际上想修改外部类中的 existing 选择器,并在我使用该选择器时让该选择器的副本覆盖外部类中的选择器。我不想修改现有的第 3 方或 Pharo 预提供的软件包。
在 GNU Smalltalk 中,我可以将其作为扩展类的正常部分。例如:
Kernel.MatchingRegexResults extend [
at: anIndex [
"My updated version of the 'official' Kernel.MatchingRegexResults#at: selector"
"This is part of my package so overrides the 'official' version"
...
]
foo [
"My new foo selector"
]
]
如何在 Pharo 5.0 中做到这一点?我已经做了很多搜索,但找不到这样做的方法。 Pharo by Example 和 Deep Into Pharo 书籍中没有出现“扩展”或“覆盖”这些词。
【问题讨论】:
-
您是否尝试过 Move to package... 命令?它可以从选择器列表的右键菜单中获得。
-
@LeandroCaniglia 是的,我做到了。事实上,我在我的问题中提到了它。如果我想为现有的外部类创建一个新的选择器并将新的选择器移动到我的包中,那么这个移动效果很好。但它不适用于修改/覆盖现有选择器,因为它将将该选择器的实现移动到我的包中并将其从外部包中删除。我不想从外部包中删除覆盖的选择器,而只是希望覆盖它。
-
Override 意味着覆盖...您将重新编写该方法,它将被移动到您的包中,但它将针对所有系统进行更改。 Pharo 没有模块系统,所以你不能在同一个类中拥有同名的不同方法......