oop – 在Perl 6中继承私有属性

前端之家收集整理的这篇文章主要介绍了oop – 在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

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;

按需工作.

猜你在找的Perl相关文章