gpt4 book ai didi

smalltalk - 如何覆盖另一个包中的类中的现有选择器

转载 作者:行者123 更新时间:2023-12-02 22:57:55 25 4
gpt4 key购买 nike

我正在使用 Pharo 5.0。在一些情况下,我在现有 Pharo 类中发现了限制或可能存在错误(例如,DBXTalk/Garage 或 Regex-Core 中的某些内容)。我希望能够修改我自己的项目之外的类中存在的一个或一组选择器,并将其作为我的包的一部分。

我找到了一些关于如何在外部类中创建选择器并将其移动到我的包中的说明(例如,如tutorial所示) 。太酷了。但在某些情况下,我实际上想修改外部类中的现有选择器,并在使用时让该选择器的副本覆盖外部类中的选择器。我不想修改现有的第 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 ExampleDeep Into Pharo 书中。

最佳答案

请注意,除了 Milan Vavra 所写的之外,名为 *YourPackage-(something) 的协议(protocol)中的每个方法都将属于包 YourPackage,无论该类所属的包。至少在 Squeak 中,有这样的约定:在 *YourPackage-override 协议(protocol)中放置像这样重写的方法。 Pharo 可能有类似的命名约定。 “移至包”功能将方法移至此类“加星号”协议(protocol)。

但是,不鼓励使用此类覆盖,因为不能让两个包同时提供同一方法的实现。 Monticello 将尝试保留原始方法和重写方法(请参阅 PackageInfo>>isOverrideCategory: 的发送者),但您的重写方法仍然有可能会被原始包的更新或您的更新所覆盖。将错过对原始方法的更新,可能会破坏事情。

“正确的方法”是重构原始包中的原始方法,使其行为更容易定制。

关于smalltalk - 如何覆盖另一个包中的类中的现有选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37770195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com