Moduł Perl6::Classes

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

Obsługa modułu Perl6::Classes

use Perl6::Classes; class Composer { submethod BUILD { print "Konstruktor nowego obiektu Composer\n" } method compose { print "Tworzę jakąś muzyczkę...\n" } } class ClassicalComposer is Composer { method compose { print "Tworzę bardzo klasyczną muzyczkę...\n" } } class ModernComposer is Composer { submethod BUILD($) { $.length = shift } method compose() { print((map { int rand 10 } 1..$.length), "\n") } has $.length; } my $beethoven = new ClassicalComposer; my $barber = new ModernComposer 4; my $mahler = ModernComposer->new(400); $beethoven->compose; # Tworzę bardzo klasyczną muzyczkę... $barber->compose # 7214 compose $mahler; # 89275869347968374698756....

Co to jest?

Moduł implementuje prototypowy obiektowy styl Perla 6.

Dla wszystkich nie mogących się doczekać Perla 6!

Szczegóły

Następujące własności są aktualnie dostępne:

subs, methods i submethods
Wraz z ich odpowiednimi zasadami zasięgu
Atrybuty
Dostępne przez słowo kluczowe has a wyglądają tak: $.this.
Dziedziczenie
Słowo kluczowe is pozwala na jednokrotne jak i wielokrotne dziedziczenie!
Sygnatury
Sygnatury methodS , subS i submethodS są dostępne tyle że w stylu Perla 5.
Ukrywanie danych
Korzystając z public, protected i private możesz wymusić ukrywanie danych. Ta własność nie działa dla atrybutów, ktore są zawsze private
Klasy anonimowe
Możesz zagnieżdżać je w metodach lub innych klasach, a nawet w tych anonimowych

Moduł uaktualnia składnię Perla o nowy deklarator class. Przewagą nad klasycznym mechanizmem obiektowym Perla jest niewątpliwie łatwość w dostrzeżeniu klasy (szczególnie dla programistów C++/Java).

Deklaracje

W środku klasy można zadeklarować następujące rzeczy:

method
Metoda w klasycznym znaczeniu tego słowa. Może być dziedziczona przez klasę pochodną. Zadeklaruj ją tak samo jak sub tylko zamiast słowa sub użyj method. Zmienne $_ i $self zawierają obiekt wywołujący, a reszta argumentów jest przekazywane przez @_. Standrdowo są publiczne.
sub
Stary dobry znajomy sub to metoda, której obiektem wywołującym jest klasa. Nie może używać atrybutów ale możesz ją wywolać z obiektu i zachowuje się polimorficznie. W każdym przypadku zmienne $_ i $self zawierają nazwę klasy dla klas nazwanych i obiekt klasy dla anonimowych. Standrdowo są publiczne.
submethod
To prawie to samo co method, z tą różnicą, że nie bierze udziału w dziedziczeniu. Najczęściej używa się tutaj metod, które tworzą, inicjalizują lub niszczą bieżący obiekt. Deklaruje się je tak samo jako metody. Standrdowo są prywatne.
has
Deklaruje atrybut, czyli jakieś prywatne dane. Mogą wyglądać tak: $.this tak: @.that albo tak: %.uhm. Czyli odpowiednio to skalar, tablica i hasz tylko, że jest jeszcze kropka przez nazwą. Atrybuty są zawsze prywatne i nie mogą być zadeklarowane inaczej.

Dziedziczenie

Można dziedziczyć po wielu klasach używając słówka kluczowego is np.: class Pegasus is Human is Horse { ... } Nie można dziedziczyć po klasach anonimowych ale klasa anonimowa może dziedziczyć po nazwanej. Metody dziedziczone zachowują się bardziej polimorficznie niż te z Perla 6: class Base { method go { ... } } class Derived is Base { method go { ... } } my $b = new Base; my $d = new Derived; $b->go; # Base::go $d->go; # Derived::go my $method = \&Base::go; $b->$method; # Base::go $d->$method # Derived::go

Konstruktory i destruktory

Są dwie warstwy konstruktorów i destruktorów. Pierwsza to konstruktor Perla, słówko kluczowe new, które tworzy obiekt. Druga to inicjalizator (w C++ i Javie zwany konstruktorem) pod nazwą BUILD. Nie musisz się martwić tworzeniem konstruktora wystarczy że stworzysz inicjalizator, który najczęsciej tworzy się jako submethod.

Podobnie jest przy destruktorach. Perl nie pozwala na tworzenie własnego prawdziwego destruktora, jedynie deinicjalizator, który jest wywolywane zaraz przed zwolnieniem pamięci. Określa go słówko kluczowe DESTROY. To wszystko robi za Ciebie moduł ale zezwala też ma stworzenie DESTRUCT, który w sumie robi to samo, no chyba że dziedziczysz.

Moduł nie zwraca uwagi na wartość zwróconą przez deinicjalizator, dlatego gdy wystąpi błąd powinnieneś wyrzucić wyjątek.

Konstruktor bazowy jest wywoływany przed dziedziczącym w takiej kolejności jaka jest podana w deklaracji klasy. Podobnie destruktor bazowy jest wywolywane po destruktorze dziedziczącym w odwrotnej kolejności.

Błędy

Kod: class Foo is Bar { method go { $_->Bar::go } } nie zadziała tak jak byś się tego spodziewał. Zostanie wywolane Foo::go. Na razie, po użyciu class, robi się bałagan z numerami lini w kodzie źródłowym.

Dodatkowe informacje

Cała dokumentacja znajduje się na http://search.cpan.org/%7Elpalmer/Perl6-Classes-0.22/Classes.pm

Autor opracowania

P.B.

Uniwersytet Gdański - Instytut Informatyki - Strona domowa - Perl - Wyklady
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.