ООП (объектно-ориентированное программирование) в Perl началось с версии 5.
ООП в Perl основано на пакетах (packages), которые содержат методы (sub-подпрограммы), свойства (переменные) и наследование (inheritance).
Для создания класса (class) в Perl, нужно создать пакет с именем класса. Например, класс "Person" может быть создан следующим образом:
package Person;
sub new {
my $class = shift;
my $self = {
_firstName => shift,
_lastName => shift,
_ssn => shift,
};
bless $self, $class;
return $self;
}
sub setFirstName {
my ( $self, $firstName ) = @_;
$self->{_firstName} = $firstName if defined($firstName);
return $self->{_firstName};
}
В примере выше, мы создали класс "Person" с конструктором new, который принимает аргументы "имя", "фамилия" и "ssn" (номер социального страхования) и создает объект "Person". Также мы создали метод setFirstName, который устанавливает имя объекта "Person".
Чтобы создать объект "Person", мы вызываем метод new, передавая ему необходимые аргументы:
my $person = new Person("John", "Doe", 123456789);
Далее мы можем использовать методы и свойства объекта "Person":
$person->setFirstName("Jane");
print $person->{_firstName}; # Jane
Также в Perl есть наследование. Для создания класса наследника (subclass), нужно указать родительский класс (parent class). Например, класс "Employee" может быть создан как наследник класса "Person":
package Employee;
use base qw(Person);
sub new {
my ( $class, $firstName, $lastName, $ssn, $employeeID ) = @_;
my $self = $class->SUPER::new( $firstName, $lastName, $ssn );
$self->{_employeeID} = $employeeID;
bless $self, $class;
return $self;
}
sub getEmployeeID {
my ($self) = @_;
return $self->{_employeeID};
}
В примере выше мы создали класс "Employee", который наследует свойства и методы класса "Person". Мы создали свойство "_employeeID" и метод "getEmployeeID", который возвращает это свойство.
Чтобы создать объект "Employee", мы вызываем метод new класса "Employee", передавая ему необходимые аргументы:
my $employee = new Employee("John", "Doe", 123456789, 1234);
Далее мы можем использовать методы и свойства объекта "Employee":
$employee->setFirstName("Jane");
print $employee->{_firstName}; # Jane
print $employee->getEmployeeID; # 1234
Таким образом, ООП в Perl основано на пакетах, которые содержат методы и свойства объектов. Наследование позволяет создавать классы наследники, которые наследуют свойства и методы родительского класса.
Классы
В Perl классы представляются пакетами (package). Пакет определяется с помощью ключевого слова "package" и следующего за ним идентификатора пакета. Внутрь пакета помещаются переменные, функции и методы класса. Определение класса может выглядеть следующим образом:
package MyClass;
# переменные класса
our $var1;
our $var2 = "Default value";
# методы класса
sub method1 {
my ($self, $arg) = @_;
# ...
}
sub method2 {
my ($self) = @_;
# ...
}
# экспорт методов класса
use Exporter qw(import);
our @EXPORT_OK = qw(method1 method2);
1; # обязательное наличие
В данном примере определен класс "MyClass". Внутрь пакета помещены два метода "method1" и "method2", а также две переменные "$var1" и "$var2". В конце определения класса указывается наличие пакета с помощью ключевого слова "1;".
Для использования класса его нужно импортировать с помощью функции "use". Например:
use MyClass qw(method1);
my $obj = MyClass->new();
$obj->method1($arg);
В данном примере класс "MyClass" импортируется с методом "method1". Далее создается объект класса "$obj" и вызывается метод "method1" с аргументом "$arg".
Для создания объектов в Perl используется функция bless. Пример создания объекта:
sub new {
my ($class, %args) = @_;
my $self = {
var1 => $args{var1} || "Default value",
var2 => $args{var2} || "Default value",
};
bless($self, $class);
return $self;
}
В данном примере определен конструктор "new", который создает объект класса и устанавливает его свойства. Функция "bless" присваивает объекту ссылку на свой класс.
Для доступа к свойствам объекта в методах используется специальное слово "self", которое ссылается на текущий объект. Например:
sub method1 {
my ($self, $arg) = @_;
$self->{var1} = $arg;
}