В Perl 6 атрибут, объявленный в классе, доступен только внутри этого класса.Это означает, что можно уверенно проводить рефакторинг состояния в классе, не беспокоясь о любом использовании этого состояния вне класса.
Подклассы не получают никакого специального доступа в отношении атрибутов.Некоторые языки предоставляют модификатор protected
.Это не существует в Perl 6, по замыслу.Либо что-то является частным для этого класса, либо открыто (например, has $.a
) для внешнего мира, поскольку:
- Что касается этого класса, то подкласс является частью внешнего мира.
- Учитывая, что общий совет состоит в том, чтобы «предпочесть композицию наследованию», кажется странным давать привилегии наследованию или предоставлять механизм, который мешает рефакторингу из наследования в композицию.
Атрибуты в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;
Работает как нужно.