Są dwa powody, dla których ktoś może chcieć robić to, co robisz, oba są złe.
Po pierwsze, próbujesz zaimportować metody z klasy nadrzędnej ... z jakiegoś powodu. Może źle rozumiesz, jak działa OO. Nie musisz tego robić. Po prostu wywołaj metody odziedziczone jako metody i jeśli te metody nie robią czegoś zwariowanego, to będzie działało dobrze.
Prawdopodobnie jest to moduł o mieszanym przeznaczeniu, w którym niektóre z nich są metodami, a niektóre z nich są importowanymi funkcjami. I za to możesz zrobić ...
use base 'Foo::Base';
use Foo::Base;
I słusznie zauważyłeś, że wygląda trochę dziwnie ... ponieważ jest to trochę dziwne.Klasa, która również eksportuje, miesza idiomy, co spowoduje dziwne wzorce użycia.
Najlepszą rzeczą do zrobienia jest przeprojektowanie klasy zamiast eksportowania funkcji, albo podzielenie funkcji na ich własny moduł, albo uczynienie ich metodami klasy. Jeśli funkcje naprawdę nie mają wiele wspólnego z klasą, to najlepiej je spryskać. Jeśli odnoszą się do klasy, wtedy uczyń je metodami klasowymi.
use base 'Foo::Base';
Foo::Base->some_function_that_used_to_be_exported;
Eliminuje to niedopasowanie interfejsu, a jako bonus, podklasy można zastąpić zachowanie metoda klasy, podobnie jak każdej innej metody.
package Bar;
use base 'Foo::Base';
# override
sub some_function_that_used_to_be_exported {
my($class, @args) = @_;
...do something extra maybe...
$class->SUPER::some_function_that_used_to_be_exported(@args);
...and maybe something else...
}
Jeśli nie masz kontroli nad klasie bazowej, można jeszcze zrobić interfejs Sane pisząc podklasę, która zamienia wyeksportowane funkcje do metod.
package SaneFoo;
use base 'Foo::Base';
# For each function exported by Foo::Base, create a wrapper class
# method which throws away the first argument (the class name) and
# calls the function.
for my $name (@Foo::Base::EXPORT, @Foo::Base::EXPORT_OK) {
my $function = Foo::Base->can($name);
*{$name} = sub {
my $class = shift;
return $function->(@_);
};
}
Tak, jest to bardzo podobne do Mojo :: Base lub Class :: Simple, thanks! Ale zdecydowałem się zrezygnować z lepszej architektury kodu =) – shootnix