如何在Raku中定义受保护的方法?

6

我有一个类和另一个继承它的类。在父类中定义了一些方法,我希望只与子类共享,而不想让全世界知道。

如何实现像其他编程语言中所使用的 protected 作用域那样的方法?

我考虑过引入一个具有私有方法的角色(role),但我还需要维护一些私有状态,以供这些方法使用,同时我也需要让两个类都 does 这个角色,但这似乎会导致(角色的)实例变量在两个类中重复...


1
请参见 https://docs.raku.org/routine/trusts 和 https://stackoverflow.com/search?q=%5Braku%5D+trusts。 - raiph
1
raiph,也许一个困难是信任页面上的示例存在错误,如果你说class B is A。这完全是由于A有一个.perl方法而B没有,所以B使用了A的方法,当然会出错,因为B的foo从未设置。(老实说,我们应该用一个好的子类信任示例更新那个文档) - user0721090601
1个回答

10

想要实现你想做的事情需要两个步骤。第一步是让父类信任子类: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 将指向直接属于 Dogmethod !secret。为了引用 Animal 的 secret 方法,我们需要明确指出:

method tell-secret { 
  say self!Animal::secret
}

现在,可以说狗泄漏了秘密。

你会注意到的一件事是,一旦一个类信任另一个类,它就完全开放了。无法将信任限制在个别方法上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接