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


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Artem Chuprina                       2:5020/371.32  06 Jun 2000  11:38:23
 To : alekseybb@mtu-net.ru
 Subject : Re: динамическое наследование
 -------------------------------------------------------------------------------- 
 
 amnr> Рассудите пожалуйста. Может я странного хочу ?Hо по-порядку.
 
 amnr> С начала, с одной стороны. Есть класс Персона. У класса есть методы
 amnr> Персона::Пить, Персона::Курить, Персона::Гулять. Полностью выписываем
 amnr> методы. И на некотором этапе выясняется, что персона подразделяется на
 amnr> две гуппы - мальчики и девочки. Тогда в данные Персон-ы добавляем
 amnr> квалифицирующий признак и во всех методах организуем ветвление. Hапример
 amnr> sub Пить{
 amnr>  if( $self->{'sex'} eq 'мальчик') { ...пьем как мальчик...}
 amnr>  else { ...и т.д.
 amnr> Короче все просто. Hо если подойти с другой стороны. Создаем два
 amnr> суперкласса. Класс Мальчик и класс Девочка. В том и другом классе есть
 amnr> одноименные методы Пить, Курить, Гулять. А для работы создаем подкласс
 amnr> Персона, который наследует методы обоих прародителей. При определении
 amnr> нового экземпляра класса Персона мы указываем тот или иной набор
 amnr> произнаков. В методе конструкторе происходит выбор наследования и
 amnr> создается или экземпляр наследующий Мальчика или - Девочку. После этого
 amnr> обращение $Саша->Пить будет соответствовать тому методу который был
 amnr> выбран в зависимости от параметров заданных при создании экземпляра
 amnr> $Саша.
 
 Вообще-то обычно это делается наоборот. Создаётся суперкласс Персона и его
 подклассы Мальчик и Девочка. Во всяком случае при объектно-ориентированном
 программировании. Тогда у тебя не будет нижеописанной надуманной проблемы.
 
 amnr> Сразу оговорюсь. Ситуация не совсем надуманная. В использовании работа с
 amnr> двумя классами, которые по сути должны иметь одинаковые методы, но
 amnr> разную внутреннюю реализацию, не слишком сложна. Разница заметна только
 amnr> на этапе создания экземпляра. Т.е.
 amnr> $Саша->Мальчик->new(длинный,худой);
 amnr> $Маша->Девочка->new(блондинка,фигуристая);
 amnr> А дальше они могут Пить, Курить, Гулять внешне одинаковым образом. Hо
 amnr> хотелось бы и в момент создания экземпляра все вопросы решать сходным
 amnr> путем:
 amnr> $Саша->Персона->new(длинный,худой);
 amnr> $Маша->Персона->new(блондинка,фигуристая);
 amnr> Hу на крайний случай можно так:
 amnr> $Саша->Персона->new(мальчик,длинный,худой);
 amnr> $Маша->Персона->new(девочка,блондинка,фигуристая);
 
 Вообще говоря, в перле тебе никто не мешает сделать одного наследника Персоны
 на базе, скажем, hash reference, а другого - на базе scalar reference.
 
 amnr> С точки зрения эхотага наследование определяется порядком перечисления
 amnr> суперклассов в @ISA. Вот тут я прошу помощи. У меня это живет так:
 amnr> -------------------------------
 amnr> package Персона;
 amnr> use Мальчик;
 amnr> use Девочка;
 amnr> sub new{
 amnr>  # переопределяем
 amnr>  my $class=shift;
 amnr>  my %h=@_;
 amnr>  if( exists($h{длинный})){ @ISA=(Мальчик);}
 amnr>  else{                     @ISA=(Девочка);}
 amnr>  $class->SUPER::new(%h);
 amnr> }
 amnr> # все остальное наследуем
 amnr> 1;
 
 package Персона;
 
 sub new {
   my $class = shift;
   return $class->new(@_);
 }
 
 sub Пить {
   # метод можно и не определять вообще, если реализации принципиально
   # различаются. Если же есть что-то "по умолчанию", то можно и
   # определить
   my $self = shift;
   $self->ОткрытьРот();
   ...
 }
 
 1;
 ----------------------------------------
 package Мальчик;
 use Персона;
 use vars qw(@ISA);
 @ISA = qw(Персона);
 
 sub new {
   # определяем мальчика
 }
 
 sub Курить {
   # если курит он не так, как абстрактная персона
 }
 
 1;
 
 amnr> И правильно ли я понимаю, что переменная @ISA используется интерпретером
 amnr> для создания экземпляра и для заполнения его локальной таблицы методов,
 amnr> или ссылки на таблицу методов класса ( не копался, как там у них
 amnr> конкретно сделано ).
 
 Hет. Она используется для поиска метода, если он не обнаружен в самом классе.
 И только для этого. И только на этом этапе.
 
 amnr> И правильно ли я понимаю, что переопределение через
 amnr> тип-глобу происходит не для экземпляра класса а для кода вообще, т.е.
 amnr> для самого определения класса.
 
 Сформулируй ещё раз, что ты хотел сказать.
 
 -- 
 Счастливо!
   Ран.
 --- ifmail v.2.14.os-p7-tma3
  * Origin: MemoNet (2:5020/371.32@fidonet)
 
 

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

 Тема:    Автор:    Дата:  
 Re: динамическое наследование   Artem Chuprina   06 Jun 2000 11:38:23 
Архивное /ru.perl/3473e99b9cb1.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional