Oop 在Perl 6中继承私有属性

Oop 在Perl 6中继承私有属性,oop,raku,Oop,Raku,我在文档中找不到任何内容,但似乎在子类中无法访问其超类的私有变量。我说得对吗 A类{ 有$!a; } B班是A班{ 有0.b美元; 方法集a($x){ $!a=$x; } } 我的$var=B.new(); $var.set_a(5); 比如说$var.a; 这将显示一条错误消息: 属性$!a未在B类中声明 顺便问一下,在哪里可以阅读文档中的类?在Perl 6中,类中声明的属性只能在该类中访问。这意味着可以自信地重构类中的状态,而不必担心在类外使用该状态 子类不接受有关属性的任何特殊访问。有

我在文档中找不到任何内容,但似乎在子类中无法访问其超类的私有变量。我说得对吗

A类{
有$!a;
}
B班是A班{
有0.b美元;
方法集a($x){
$!a=$x;
}
}
我的$var=B.new();
$var.set_a(5);
比如说$var.a;
这将显示一条错误消息:

属性$!a未在B类中声明

顺便问一下,在哪里可以阅读文档中的类?在Perl 6中,类中声明的属性只能在该类中访问。这意味着可以自信地重构类中的状态,而不必担心在类外使用该状态

子类不接受有关属性的任何特殊访问。有些语言提供了受保护的修饰符。这在Perl 6中是不存在的。某个对象是该类的私有对象,或者是向外部世界公开的对象(例如
具有$.a
),因为:

  • 就这个类而言,子类是外部世界的一部分
  • 考虑到一般的建议是“更喜欢组合而不是继承”,赋予继承特权或提供一种机制来阻止从继承到组合的重构似乎很奇怪
  • 相比之下,
    角色
    中的属性被组合到类中,就像它们已经在类本身中声明一样工作。因此,可以在类主体中使用组合的
    角色的属性。如果希望在OO上下文中编写可重用的功能片段,则更典型的做法是在Perl6中使用角色和组合,而不是继承。实际上,将原始代码编写为:

    role A {
      has $!a;
    }
    
    class B does A {
      has $.b;
    
      method set_a($x) {
        $!a = $x;
      }
      method a() { $!a }
    }
    
    my $var = B.new();
    $var.set_a(5);
    say $var.a;
    

    根据需要工作。

    您可以使用“信任”获得访问权限。我还没有在子类中尝试过。()主类文档在这里:。根据定义。不过,也许这可以在文件中明确说明。