加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:42:12 所属栏目:大数据 来源:网络整理
导读:我在文档中找不到任何内容,但似乎子类中没有访问其超类的私有变量.我对吗? 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
我在文档中找不到任何内容,但似乎子类中没有访问其超类的私有变量.我对吗?
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;

按需工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读