Moduł Perl6::Classes
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaObsł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:
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.