Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объектно Ориентированное Программирование, Обсуждение ООП в Perl 
:(
    Опции темы
tishaishii
Дата 6.2.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 4
Всего: 8



Не знаю, на каком языке ты говоришь, Nab, но множественное наследование - вполне ясная вещьчь: кто последний, тот и прав.
PM MAIL ICQ Skype   Вверх
Zuzu
Дата 7.2.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.10.2006
Где: Екатеринбург

Репутация: 3
Всего: 4



Цитата(tishaishii @  7.2.2007,  00:47 Найти цитируемый пост)
 множественное наследование - вполне ясная вещьчь: кто последний, тот и прав. 


Т.е. ты утверждаешь, что если есть метод m1() в классе Father и Mather, Child - их наследник (от Father Mother), то выполнится код от Mother?   Или приведенный ниже код выдаст результат "M1 from Mother", так?


Код

package Class;

sub new {
my $something = shift;
my $class = ref($something) || $something;
my $data = {};

return bless($data, $class);
}

package Mother;
use base qw/Class/;

sub m1 { print "M1 from Mother \n" }

package Father;
use base qw/Class/;

sub m1 { print "M1 from Father \n" }

package Child;
use base qw/Father Mother/;

package main;

my $aChild = new Child;
$aChild->m1;
exit;




Ты заблуждаешься! В перле - другие правила поиска методов. Описаны правила, в частности, в Cookbook. Будет "M1 from Father". Или в записи use base qw/Father Mother/ ты считаешь Father последним?



Это сообщение отредактировал(а) Zuzu - 7.2.2007, 09:49
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
tishaishii
Дата 7.2.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 4
Всего: 8



Код

package Class;
sub new {+bless {}, shift}

package A;
use base Class;
sub m1 {print "A\n"}

package B;
use base Class;
sub m1 {print "B\n"}

package C;
use base Class;
sub m1 {print "C\n"}

package Child;
use base qw(A B C);

package main;

Child->new->m1;

Я ту книжку частично для справки читал, а лучше читать художественную литературу или газету иногда, а языком программирования надо пользоваться.

Ну я в параметры base::import  в Child местами попереставлял, получил, что работает "кто первый, тот и прав". Ну так и что же в этом мудрёного?
PM MAIL ICQ Skype   Вверх
Zuzu
Дата 8.2.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.10.2006
Где: Екатеринбург

Репутация: 3
Всего: 4



tishaishii.  То, что я описал - очевидно. И следует непосредственно из оригинальной документации по Perl. Там написано все очень четко.

Правило "Кто первый, тот и прав" - тоже не катит.

Ниже - простейший код. Какой метод m1 снаследует Child в этом случае? По твоему предположению - выходит от Mother -  это неверно.

Код

package Class;

sub new {
my $something = shift;
my $class = ref($something) || $something;
my $data = {};

return bless($data, $class);
}

sub m1 { print "M1 from Class \n" }

# --------------------------

package Mother;
use base qw/Class/;

sub m1 { print "M1 from Mother \n" }

# --------------------------

package Father;
use base qw/Class/;

# --------------------------

package Neighbour;
use base qw/Сlass/;
sub m1 { print "M1 from Neighbour \n" }

# --------------------------

package Child;
use base qw/Father Mother Neighbour/;

# --------------------------
package main;

my $aChild = new Child;
$aChild->m1;
exit;


Спросишь, к чему это я? 

Во-первых, лично я привык понимать, что делает программа без ее запуска на выполнение. Очень часто это спасало, когда нужно было быстро исправить ошибку на "живом" проекте, который реально работает. А на "исправление по всем правилам" - перенос всего кода и данных на площадку поддержки, исправление и отладка там, перенос отлаженного кода обратно на "реальный проект" - просто заказчик не дает времени.
А во-вторых, просто хочется увидеть код твоего класса с геттерами-сеттерами через tie для моей простейшей модели с множественным наследованием. Той, что я рисовал в виде диаграмки. Я свой код написал прямо в форум буквально за пару минут.
 

Это сообщение отредактировал(а) Zuzu - 8.2.2007, 10:56
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
Zuzu
Дата 8.2.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.10.2006
Где: Екатеринбург

Репутация: 3
Всего: 4



Nab, я посмотрел lvalue применительно к методам класса  (как к setter'ам для свойств объекта). Мне не понравилось. Ожидал чуда, а они работают именно как lvalue smile Т.е. меняют значение переменной, указанной в return процедуры.

Соответсвенно, никакой радости в виде проверки корректности данных (внутри процедуры-метода) мы не получаем - работаем-то внутри процедуры со старыми, предыдущими значениями. Короче, скорее всего, использовать не буду. Смысла не вижу.

Несколько сумбурно получилось. Если что непонятно написал - говори, приведу пример кода.


Это сообщение отредактировал(а) Zuzu - 8.2.2007, 12:01
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
nitr
Дата 8.2.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Zuzu, я думаю тут видно... 
Цитата

Правило "Кто первый, тот и прав"

Код

...
use base qw/Father Mother Neighbour/;
...

тут первый Father

меняем и получаем smile)
Код

use base qw(Mother Father Neighbour);

Цитата

M1 from Mother

smile

tishaishii, прав с этим правилом ;)


--------------------
PM   Вверх
Zuzu
Дата 8.2.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.10.2006
Где: Екатеринбург

Репутация: 3
Всего: 4



nitr, вопрос был не в том, как сделать, чтобы вызвался "M1 form Mother", а в том, какой метод реально вызовется без внесения изменения в код.  smile

Если (для моего последнего примера кода) пользоваться правилом "Кто первый, то прав", должет вызваться "M1 from Mother", а это не так. Думаю, не открою тайну, если скажу, что результат будет "M1 from Class" smile т.е. Child при такой записи наследует метод от своего "самого базового" класса. Это, с какой-то стороны, логично, но без прочтения документации неочевидно.



Это сообщение отредактировал(а) Zuzu - 8.2.2007, 12:17
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
Zuzu
Дата 8.2.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.10.2006
Где: Екатеринбург

Репутация: 3
Всего: 4



Все, до меня наконец-то дошло, почему концептуально все работает именно так. 

tishaishii, ты абсолютно прав! Работает правило "Кто первый тот  и прав". Все абсолютно логично. Просто нужно рассматривать классы, как некую "конечную сущность". Действует правило, аналогичное правилу написния UML-диаграмм, которое, если просто, гласит: что если чего-то не написано, это еще не значит, что его нет.

В моем примере у класса Father уже есть метод m1(), несмотря, на то, что в самом классе его нет. Father его снаследовал от Class! 

По правилу "Кто первый, тот и прав"  - первый Father. У него есть снаследованный метод m1(). Именно он и наследуется.

Это сообщение отредактировал(а) Zuzu - 8.2.2007, 12:48
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
Nab
Дата 8.2.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Цитата(Zuzu @  8.2.2007,  11:07 Найти цитируемый пост)
Несколько сумбурно получилось. Если что непонятно написал - говори, приведу пример кода.

приводи


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Zuzu
Дата 8.2.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.10.2006
Где: Екатеринбург

Репутация: 3
Всего: 4



Nab, пример кода с lvalue


Код

#!/usr/bin/perl

use strict;
my $X = 100;

sub x : lvalue {
#
# x > 0: correct, x < 0 incorrect
print "X value: $X, it is " . (($X > 0) ? 'correct' : 'incorrect') . "\n";

$X;
}

print 'set X value to 10... Result: ';
x = 10;
print 'set X value to -20... Result: ';
x = -20;
print 'set X value to 30... Result: ';
x = 30;

exit;



Результат:

Код

set X value to 10... Result: X value: 100, it is correct
set X value to -20... Result: X value: 10, it is correct
set X value to 30... Result: X value: -20, it is incorrect


--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
Nab
Дата 8.2.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Стыдно мне, таки нифига оно не работает smile

Плохо проверял однако smile И не до конца разобрался smile

Приношу всем извенения, за то что ввел в заблуждение народ....



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Shaggie
Дата 9.2.2007, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Цитата(Zuzu @  8.2.2007,  11:07 Найти цитируемый пост)
Nab, я посмотрел lvalue применительно к методам класса  (как к setter'ам для свойств объекта). Мне не понравилось. Ожидал чуда, а они работают именно как lvalue, т.е. меняют значение переменной, указанной в return процедуры.

Zuzu, по-моему, то как раз то, чего можно ожидать от использования lvalue. WYSIWYG кажется это называется...
Nab, за что извиняешься? Мне вот кажется, что ты прав.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
Zuzu
Дата 9.2.2007, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.10.2006
Где: Екатеринбург

Репутация: 3
Всего: 4



Shaggie, я ожидал от lvalue чуда в том смысле, что надеялся, что оно сначала (грубо говоря, перед первой строкой кода процедуры) присвоит значение переменной, а уже внутри процедуры-метода можно будет использоваться именно это, новое значение. По аналогии с передачей параметров внутрь процедуры.

При проверке выяснилось, что не так (см. пример кода).

Это сообщение отредактировал(а) Zuzu - 9.2.2007, 10:58
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
tishaishii
Дата 11.2.2007, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 4
Всего: 8



Т.е. ты нарочно схимичил и не переписал метод m1 для Father, чтобы с первого взгляда казалось, что вызывается не Father::m1, а Class::m1? Не получилось у тебя запутать:)))

И чего такого "чудесного" от lvalue ты ожидал? Механизм как механизм, а ты ждал "чудесный" механизм? Ну и используй значение, кто не даёт?

Вобщем, что-то мне уже эта тема надоела, в основном приходится доказывать, что 1=1, а 0=0 - тавтология.

Это сообщение отредактировал(а) tishaishii - 11.2.2007, 08:30
PM MAIL ICQ Skype   Вверх
Shaggie
Дата 12.2.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Мои пять копеек.

Zuzu где-то отметил трудности с созданием закрытых методов класса (по типу private). Рискуя изобрести очередную вариацию велосипеда, я все же решился провести некоторые опыты и на личном примере убедиться в истинности либо ложности данного утверждения. Для примера Zuzu предлагал создать класс Кошка и объявить в нем метод Говорить... Ок, так и поступим.
Код

#!/usr/bin/perl
use strict;
use warnings;

package Cat;

sub call {
    my $class=ref($_[0])||$_[0];
    return bless {}, $class;
}

sub say {
    print "Meeooowwwww!";
}

package main;

my $Tasya=call Cat;
$Tasya->say;

У нас есть кошка Тася, которая говорит "Мяу". Вопрос - метод закрытый? Ну, как сказать... Например, имеет силу такой вот код:
Код

Cat->say;

То есть объект не создан, память не выделена. Мяукает какая-то совсем другая кошка, не та, которую я позвал...
Была недавно тема о том, как определить, объект ли передан в функцию. Самый простой способ:
Код

# переписываем код метода say
sub say {
    return if index(shift,"=")==-1;
    print "Meeooowwwww!";
}

И теперь некая безымянная кошка мяукать не может. Однако... say - это просто функция по большому счету. То есть имеет смысл такой вот код:
Код

Cat::say;

И если не будет той проверочной строчки в say, то любой волк в кошачьей шкуре сможет сказать "Мяу". А теперь вылезает ошибка, так как параметры в функцию не передаются, и shift ругается на unitialized value. Исправляем:
Код

sub say {
    my $temp=shift;
    return if !defined $temp or index($temp,"=")==-1;
    print "Meeooowwwww!";
}

И только потом до меня дошло, что проверка на "=" сработает на ЛЮБОМ объекте, передаваемом в функцию! Для проверки я создал пакет Dog, в нем метод call, совершенно аналогичный такому же в Cat. И теперь:
Код

my $Pirat=call Dog;
$Pirat->Cat::say;

И пес Пират мяукает по-кошачьи! Прелестно... но надо править.
Код

sub say {
    my $temp=shift;
    return if !defined $temp or index($temp,"Cat=")==-1;
    print "Meeooowwwww!";
}

Вот это получилось похоже на закрытый метод.

Как видим, в Перл возможность создания закрытого метода класса не поддерживается на уровне языка, но легко осуществляется его же возможностями.

Это мой первый опыт объектного программирования в Перл, поэтому просьба комментировать если оказался не прав.

И наверняка существуют модули под это дело...


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1696 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.