我在文档中找不到任何内容,但似乎子类中没有访问其超类的私有变量.我对吗?
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)外部世界,因为:
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)
按需工作.