Pharo中Trait方法的重写与扩展:能否通过重写调用super实现?
在Pharo中重写Trait方法并调用super扩展的可行性
在Pharo中,完全支持通过重写Trait的方法并调用super关键字来扩展其功能。
核心原理
当类引入Trait后,Trait中的方法会被整合到类的方法查找链中:类自身的方法优先级最高,其次是Trait的方法,最后是超类的方法。因此,在类重写的方法里调用super时,会优先查找Trait中对应的方法(若超类无同名方法),从而实现对Trait方法的扩展。
示例验证
你的代码写法是有效的,我们可以补充具体逻辑来验证:
TMyTrait >> foo "Trait原方法逻辑" Transcript show: '[Trait] foo 执行'; cr. MyClassThatUsesTrait >> foo super foo. "调用Trait中的foo方法" "类扩展的额外逻辑" Transcript show: '[Class] foo 扩展逻辑执行'; cr.
当创建MyClassThatUsesTrait的实例并调用#foo时,控制台会依次输出:
[Trait] foo 执行 [Class] foo 扩展逻辑执行
注意事项
如果类的超类中也定义了同名的foo方法,那么super foo会优先调用超类的方法,而非Trait的。这种场景下,若需要明确调用Trait的方法,可以通过(self traitNamed: #TMyTrait) foo的方式直接调用,但绝大多数情况下,super的默认行为已能满足扩展需求。
内容的提问来源于stack exchange,提问作者Oleksandr Zaitsev
相关产品推荐
相关产品推荐

