在 Perl 6 中继承私有属性

Inheriting private attributes in Perl 6

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

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;

这会给出一条错误消息:

Attribute $!a not declared in class B

顺便说一下,在哪里可以阅读文档中的 类?我只找到了一个相当短的部分 Classes and Objects.

在 Perl 6 中,在 class 中声明的属性只能在 class 中访问。这意味着可以自信地重构 class 中的状态,而不必担心在 class.

之外对该状态的任何使用

Subclasses 不接收关于属性的任何特殊访问权限。某些语言提供 protected 修饰符。按照设计,这在 Perl 6 中不存在。要么某些东西是 class 私有的,要么是暴露给外界的(比如 has $.a),因为:

  1. 就class而言,子class是外部世界的一部分。
  2. 鉴于一般的建议是 "prefer composition over inheritance",特权继承似乎很奇怪,或者提供一种阻碍从继承重构到组合的机制。

相比之下,role 中的属性被组合到 class 中,就好像它们已在 class 本身中声明一样。因此,可以在 class 正文中使用组合 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;

如愿以偿。