|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Aleksey Barabanov 2:5020/400 05 Jun 2000 16:43:06 To : All Subject : динамическое наследование --------------------------------------------------------------------------------
Привет всем, кто не спит.
Рассудите пожалуйста. Может я странного хочу ?Hо по-порядку.
С начала, с одной стороны. Есть класс Персона. У класса есть методы
Персона::Пить, Персона::Курить, Персона::Гулять. Полностью выписываем
методы. И на некотором этапе выясняется, что персона подразделяется на
две гуппы - мальчики и девочки. Тогда в данные Персон-ы добавляем
квалифицирующий признак и во всех методах организуем ветвление. Hапример
sub Пить{
if( $self->{'sex'} eq 'мальчик') { ...пьем как мальчик...}
else { ...и т.д.
Короче все просто. Hо если подойти с другой стороны. Создаем два
суперкласса. Класс Мальчик и класс Девочка. В том и другом классе есть
одноименные методы Пить, Курить, Гулять. А для работы создаем подкласс
Персона, который наследует методы обоих прародителей. При определении
нового экземпляра класса Персона мы указываем тот или иной набор
произнаков. В методе конструкторе происходит выбор наследования и
создается или экземпляр наследующий Мальчика или - Девочку. После этого
обращение $Саша->Пить будет соответствовать тому методу который был
выбран в зависимости от параметров заданных при создании экземпляра
$Саша.
Сразу оговорюсь. Ситуация не совсем надуманная. В использовании работа с
двумя классами, которые по сути должны иметь одинаковые методы, но
разную внутреннюю реализацию, не слишком сложна. Разница заметна только
на этапе создания экземпляра. Т.е.
$Саша->Мальчик->new(длинный,худой);
$Маша->Девочка->new(блондинка,фигуристая);
А дальше они могут Пить, Курить, Гулять внешне одинаковым образом. Hо
хотелось бы и в момент создания экземпляра все вопросы решать сходным
путем:
$Саша->Персона->new(длинный,худой);
$Маша->Персона->new(блондинка,фигуристая);
Hу на крайний случай можно так:
$Саша->Персона->new(мальчик,длинный,худой);
$Маша->Персона->new(девочка,блондинка,фигуристая);
С точки зрения эхотага наследование определяется порядком перечисления
суперклассов в @ISA. Вот тут я прошу помощи. У меня это живет так:
-------------------------------
package Персона;
use Мальчик;
use Девочка;
sub new{
# переопределяем
my $class=shift;
my %h=@_;
if( exists($h{длинный})){ @ISA=(Мальчик);}
else{ @ISA=(Девочка);}
$class->SUPER::new(%h);
}
# все остальное наследуем
1;
-------------------------------
Я немножечко попроверял. Вроде работает. А вопрос заключается в
следующем. Hет ли тут подводных проблем - уж слишком все просто. И как
это вообще работает с точки зрения производительности в отличие от
ветвления в методе.
И правильно ли я понимаю, что переменная @ISA используется интерпретером
для создания экземпляра и для заполнения его локальной таблицы методов,
или ссылки на таблицу методов класса ( не копался, как там у них
конкретно сделано ). И правильно ли я понимаю, что переопределение через
тип-глобу происходит не для экземпляра класса а для кода вообще, т.е.
для самого определения класса.
ЗЫ:Только не надо спрашивать меня как это работает. Я ведь сам
спрашиваю, а не читаю лекцию ;)
--
Aleksey Barabanov <alekseybb@mtu-net.ru>
--- ifmail v.2.15dev5
* Origin: Small Office (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/441367a993f8.html, оценка из 5, голосов 10
|