我在文档中找不到任何内容,但似乎子类中无法访问其超类的私有变量。我对吗?
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
顺便说一句,在哪里可以阅读文档中的类?我只找到了一个相当短的部分类和对象.
在 Perl 6 中,类中声明的属性只能在该类中访问。这意味着人们可以自信地重构类中的状态,而不必担心该状态在类之外的任何使用。
子类不接受任何有关属性的特殊访问。有些语言提供了protected
修饰符。根据设计,Perl 6 中不存在这种情况。要么是该类私有的,要么是公开的(比如has $.a
)对于外界来说,因为:
- 就该类而言,子类是外部世界的一部分。
- 鉴于一般建议是“优先选择组合而不是继承”,赋予继承特权,或者提供一种阻止从继承到组合的重构的机制似乎很奇怪。
a 中的属性role
相比之下,它们被组合到类中,就像它们已在类本身中声明一样工作。因此,来自组合的属性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;
按预期工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)