|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/3473e99b9cb1.html, оценка из 5, голосов 10
|