在 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
),因为:
- 就class而言,子class是外部世界的一部分。
- 鉴于一般的建议是 "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;
如愿以偿。
我在文档中找不到任何内容,但似乎在子类中无法访问其超类的私有变量。我说得对吗?
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
),因为:
- 就class而言,子class是外部世界的一部分。
- 鉴于一般的建议是 "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;
如愿以偿。