Наследование личных атрибутов в Perl 6 - PullRequest
0 голосов
/ 26 апреля 2018

Я ничего не могу найти в документации, но кажется, что в подклассе нет доступа к закрытым переменным его суперкласса.Я прав?

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

Кстати, где прочитать о классах в документах?Я нашел только довольно короткий раздел Классы и объекты .

1 Ответ

0 голосов
/ 26 апреля 2018

В Perl 6 атрибут, объявленный в классе, доступен только внутри этого класса.Это означает, что можно уверенно проводить рефакторинг состояния в классе, не беспокоясь о любом использовании этого состояния вне класса.

Подклассы не получают никакого специального доступа в отношении атрибутов.Некоторые языки предоставляют модификатор protected.Это не существует в Perl 6, по замыслу.Либо что-то является частным для этого класса, либо открыто (например, has $.a) для внешнего мира, поскольку:

  1. Что касается этого класса, то подкласс является частью внешнего мира.
  2. Учитывая, что общий совет состоит в том, чтобы «предпочесть композицию наследованию», кажется странным давать привилегии наследованию или предоставлять механизм, который мешает рефакторингу из наследования в композицию.

Атрибуты вrole, напротив, составлены в класс, работая так, как будто они были объявлены в самом классе.Следовательно, атрибут из составного role может использоваться в теле класса.Если вы хотите написать повторно используемые части функциональности в контексте ОО, более типично использовать роли и состав в 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;

Работает как нужно.

...