我无法在文档中找到任何内容,但似乎子类中没有访问其超类的私有变量。我是对的吗?
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
BTW在哪里阅读文档中的类?我只发现了一个相当短的部分Classes and Objects。
答案 0 :(得分:13)
在Perl 6中,类中声明的属性只能在该类中访问。这意味着人们可以自信地重构班级中的州,而不必担心在班级之外对该州的任何使用。
子类不会收到有关属性的任何特殊访问权限。某些语言提供protected
修饰符。根据设计,这在Perl 6中不存在。这个类是私有的,或者被暴露(如has $.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;
按需运作。