我在文档中找不到任何内容,但似乎子类中没有访问其超类的私有变量.我对吗?
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.
解决方法
在Perl 6中,类中声明的属性只能在该类中访问.这意味着可以自信地重构班级中的州,而不必担心班级之外对该州的任何使用.
子类不会收到有关属性的任何特殊访问权限.某些语言提供受保护的修饰符. Perl 6中没有这样的设计.这个类是私有的,或者暴露给外部世界(比如$.a),因为:
>就该类而言,子类是外部世界的一部分.
>鉴于一般建议是“更喜欢组合而不是继承”,特权继承似乎很奇怪,或者提供一种阻碍从继承到组合重构的机制.
相反,角色中的属性被组合到类中,就好像它们已经在类本身中声明一样.因此,可以在类主体中使用来自组合角色的属性.如果要在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;
按需工作.