我有一个类和另一个继承它的类。在父类中定义了一些方法,我希望只与子类共享,而不想让全世界知道。
如何实现像其他编程语言中所使用的 protected 作用域那样的方法?
我考虑过引入一个具有私有方法的角色(role),但我还需要维护一些私有状态,以供这些方法使用,同时我也需要让两个类都 does
这个角色,但这似乎会导致(角色的)实例变量在两个类中重复...
想要实现你想做的事情需要两个步骤。第一步是让父类信任子类:trusts
。
class Dog { ... } # forward declaration necessary
class Animal {
trusts Dog; # Dog now has access to private methods
method !secret {
return 42
}
}
class Dog is Animal {
method tell-secret { ... }
}
现在,让我们让狗揭示动物的秘密。你可能会认为这很简单。
method tell-secret {
say self!secret
}
但这并不能起作用。虽然调用公共方法将遵循标准 MRO 来确定被调用的方法,但对于私有方法,我们必须明确指出。在这种情况下,self!secret
将指向直接属于 Dog
的 method !secret
。为了引用 Animal
的 secret 方法,我们需要明确指出:
method tell-secret {
say self!Animal::secret
}
现在,可以说狗泄漏了秘密。
你会注意到的一件事是,一旦一个类信任另一个类,它就完全开放了。无法将信任限制在个别方法上。
class B is A
。这完全是由于A有一个.perl
方法而B没有,所以B使用了A的方法,当然会出错,因为B的foo从未设置。(老实说,我们应该用一个好的子类信任示例更新那个文档) - user0721090601