在Perl 6中继承私有属性

时间:2018-04-25 21:10:34

标签: oop perl6

我无法在文档中找到任何内容,但似乎子类中没有访问其超类的私有变量。我是对的吗?

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

1 个答案:

答案 0 :(得分:13)

在Perl 6中,类中声明的属性只能在该类中访问。这意味着人们可以自信地重构班级中的州,而不必担心在班级之外对该州的任何使用。

子类不会收到有关属性的任何特殊访问权限。某些语言提供protected修饰符。根据设计,这在Perl 6中不存在。这个类是私有的,或者被暴露(如has $.a)到外面的世界,因为:

  1. 就该类而言,子类是外部世界的一部分。
  2. 鉴于一般的建议是"更喜欢组合而不是继承",特权继承似乎很奇怪,或者提供一种阻碍从继承到组合的重构的机制。
  3. 相比之下,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;
    

    按需运作。