在Perl 6中继承私有属性

Eug*_*sky 8 oop perl6

我在文档中找不到任何内容,但似乎子类中没有访问其超类的私有变量.我对吗?

class A {
  has $!a;
}

class B is A {
  has $.b;

  method set_a($x) {
    $!a = $x;
  }
}

my $var = B.new();
$var.set_a(5);
say $var.a;
Run Code Online (Sandbox Code Playgroud)

这会给出一条错误消息:

Attribute $!a not declared in class B
Run Code Online (Sandbox Code Playgroud)

BTW在哪里阅读文档中的类?我只发现了一个相当短的部分类和对象.

Jon*_*ton 13

在Perl 6中,类中声明的属性只能在该类中访问.这意味着人们可以自信地重构班级中的状态,而不必担心在班级之外对该州的任何使用.

子类不会收到有关属性的任何特殊访问权限.某些语言提供protected修饰符.根据设计,这在Perl 6中不存在.这个类别中的某些东西是私有的,或者暴露(比如has $.a)外部世界,因为:

  1. 就该类而言,子类是外部世界的一部分.
  2. 鉴于一般建议是"更喜欢组合而不是继承",特权继承似乎很奇怪,或者提供一种阻碍从继承到组合的重构的机制.

role相反,a中的属性组成了类,就好像它们已经在类本身中声明一样.因此,role可以在类主体中使用来自合成的属性.如果希望在OO上下文中编写可重用的功能部件,则更常见的是在Perl 6中使用角色和组合,而不是继承.确实,将原始代码编写为:

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;
Run Code Online (Sandbox Code Playgroud)

按需工作.