gpt4 book ai didi

oop - 在 Perl 6 中继承私有(private)属性

转载 作者:行者123 更新时间:2023-12-03 16:45:12 27 4
gpt4 key购买 nike

我在文档中找不到任何内容,但似乎子类中无法访问其父类(super class)的私有(private)变量。我对吗?

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

顺便说一句,在哪里可以阅读文档中的类?我只找到了一个相当短的部分 Classes and Objects .

最佳答案

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

子类不会收到任何关于属性的特殊访问权限。某些语言提供 protected修饰符。这在 Perl 6 中不存在,这是设计的。要么是该类私有(private)的,要么是暴露给外界的(如 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;

    根据需要工作。

    关于oop - 在 Perl 6 中继承私有(private)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50031400/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com