Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 динамическое наследование   Aleksey Barabanov   05 Jun 2000 16:43:06 
 Re: динамическое наследование   Aleksey Barabanov   05 Jun 2000 18:27:57 
 Re: динамическое наследование   Paul Kulchenko   05 Jun 2000 23:11:54 
 Re: динамическое наследование   Aleksey Barabanov   06 Jun 2000 13:36:05 
 Re: динамическое наследование   Paul Kulchenko   07 Jun 2000 00:46:13 
 Re: динамическое наследование   Aleksey Barabanov   07 Jun 2000 15:21:29 
 Re: динамическое наследование   Oleg A. Paraschenko   06 Jun 2000 14:10:25 
 Re: динамическое наследование   Aleksey Barabanov   06 Jun 2000 16:28:51 
 Re: динамическое наследование   Oleg A. Paraschenko   06 Jun 2000 21:07:28 
 Re: динамическое наследование   Aleksey Barabanov   07 Jun 2000 15:21:32 
 Re: динамическое наследование   Aleksey Barabanov   12 Jun 2000 02:53:55 
Архивное /ru.perl/441367a993f8.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional