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

Поиск:

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


Эксперт
****


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

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



Shaggie,
Цитата

 И только потом до меня дошло, что проверка на "=" сработает на ЛЮБОМ объекте, передаваемом в функцию!

для этого есть Class::ISA(::self_and_super_path как пример)
там можно и смотреть...

может кто скажет, что тут имеете ввиду под "закрытыми методами класса (по типу private)"? smile А то неувязочка в моей голове...


--------------------
PM   Вверх
Nab
Дата 12.2.2007, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Shaggie @  12.2.2007,  09:12 Найти цитируемый пост)
Это мой первый опыт объектного программирования в Перл, поэтому просьба комментировать если оказался не прав.

С этого и начнем smile

проверка на принадлежность определенному классу делается проще всего:
Код

if (ref shift eq 'Cat') { ... }


А я искал способ определить приведена ли ссылка.

Второе, private метод это метод который в принципе не виден и не может быть вызван, ВООБЩЕ.


А реализовывается он при необходимости таким способом:

Код

# файл Cat.pm
package Cat;

use strict;
use warnings;

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

my $say = sub {
    print "Meeooowwwww!";
}

sub gav { shift->$say }

1;


#############################3

# файл Dog.pm
package Dog;

use base 'Cat';

# не верный вызов $say не доступна в потомке
sub gav_gav { shift->$say }

1;

# файл test.pl
#!/usr/bin/perl
use strict;
use warnings;

use Cat;

my $c = call Cat;

# будет вызвано и отработает корректно внутренний метод say
$c->gav;

# таких методов нет, они просто не видны в текущем пространстве имен.
$c->$say;
# а эт в любом случае не верный вызов :)
$c->say;

use Dog;

my $c = call Dog;

# тоже отработает нормально
$c->gav;

# здесь будет ошибка потому как внутренний метод заключенный в my $say не доступен из потомка
$c->gav_gav;

1;



все , метод say может быть вызван только внутри ФАЙЛА, содержащего пакет и нигде более... 
даж потомки не смогут, если они определены в другом файле.

Если как в Вашем примере, то они могут звать друг друга как угодно...



Это сообщение отредактировал(а) Nab - 12.2.2007, 13:46


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


Опытный
**


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

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



А если файл Dog.pm
сделать таким:
Код

package Dog;

use base 'Cat';

my $say = sub { print "Gaaaaav!\n"};

sub gav_gav { shift->$say }

1;


то отраютают  и gav и gav_gav.

но во втором случае собака всеже залает smile


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


Опытный
**


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

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



Nab, спасибо.

Проверка на принадлежность определенному классу - действительно удобно. То, что мне и было нужно.

Восстанавливаю затертое.

Да, появилось замыкание. Да, метод say теперь является ссылкой на функцию, вызываемой из метода gav, и теперь никто не может обратиться к методу say... Но работает такой код:
Код

Cat->gav;
Cat::gav;

В результате к ЗАКРЫТОМУ методу say можно обратиться через ОТКРЫТЫЙ метод gav. То есть в любом случае закрытость методов от использования потомками/простым кодом не обеспечивается.

Это сообщение отредактировал(а) Shaggie - 13.2.2007, 08:17


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


Опытный
**


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

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



Shaggie, не верный вывод....
gav сделан как обертка, только для демонстрации. Не обязательно он нужен, зато метод сохраненный в преременной $say не доступен нигде кроме пакета в котором он определен, то есть если не делать gav, то это реально приватный метод получается...

А изменилось то что метод say в вашем варианте вызвать можно, но будет ошибка при выполнении, а вызвать мой заключенный в переменную метод вам не даст компилятор еще на стадии компиляции сказав что метода то такого и нет... И переопределить  такой метод в потомке не получиться, а только можно создать свой с таким же именем...

Так что разница есть и существенная...


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


Опытный
**


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

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



Nab, не понимаю:
Код

package Cat;
use strict;
use warnings;
sub new {
    my $class=ref($_[0])||$_[0];
    return bless {}, $class;
}
my $say = sub {
    print "Meeooowwwww!";
}
sub gav { shift->$say } # ругается: global symbol $say requires explicit package name
1;



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


Опытный
**


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

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



Цитата(Shaggie @ 12.2.2007,  14:51)
Nab, не понимаю:
Код

package Cat;
use strict;
use warnings;
sub new {
    my $class=ref($_[0])||$_[0];
    return bless {}, $class;
}
my $say = sub {
    print "Meeooowwwww!";
}
sub gav { shift->$say } # ругается: global symbol $say requires explicit package name
1;

Да уж smile, это называеться найди 10 отличий...

Код

my $say = sub {
    print "Meeooowwwww!";
}

Это не просто определение функции после которой не нужно ставить точку с запятой, это операция присваивания...

И верно будет так:
Код

my $say = sub {
    print "Meeooowwwww!";
};


И вообще Shaggie, боюсь нас не верно поймут, потому как эта теме вынесена в прикрепленные, именно для обсуждения тонкостей и нюансов, а также некоторых неочевидных вещей. А те вопросы которые мы сейчас обсуждаем описаны в большинстве учебников по Перл.

Может стоит задавать непонятные вопросы в обычном форуме, а эту тему оставить для всяких "извращенцев от перла" smile


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


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


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

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



PM MAIL ICQ Skype   Вверх
Shaggie
Дата 13.2.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tishaishii, спасибо. Насколько я понял, модуль private применяет в качестве основы обеспечения закрытости доступа модули Class::Fields::Attribs (обеспечивающий имена констант) и Class::Fields::Fuxor (обеспечивающий функции установки и проверки прав доступа), а от себя проверяет наличие подчеркивания перед именем закрытого метода. Этакий use strict для объектного программирования smile 

Nab, код скопирован из твоего примера smile Насчет отличий - понятно объяснил, спасибо. Действительно глупая ошибка, я мог бы и сам заметить smile Насчет закрытости методов - увы, остаюсь при своем мнении: этого нет в языке, но несложно реализовать его возможностями (что демонстрируют имеющиеся модули. Рекомендую к изучению, они действительно могут обеспечить поддержку объектов в Перл).

Всем спасибо! smile 


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


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


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

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



Код
package P1;

my%private=(
    kwa=>sub {print "Я - Лягушка-Квакушка, а ты хто?\n"},
    wuu=>sub {print "А я - Зайчик-Попрыгайчик.\n"},
    muu=>sub {print "Папа, а где море?\n"},
    ooo=>sub {print "Мама, а где папа?\n"}
);

sub new {
    my($class, $self)=(shift, {@_});
    +bless $self, $class
}
sub AUTOLOAD {
    my($self)=shift;
    die 'Нет такого мэтода, Эксепшон' unless
        grep(__PACKAGE__ eq $_, @{+scalar(caller).'::ISA'}) && exists $private{+($AUTOLOAD=~m{::(.+)$})[0]};
    +$private{$1}(@_)
}

package P2;
use base P1;

sub test {+shift->kwa}

package Z;

my$o=P2->new;
#$o->kwa;
$o->test;


Это сообщение отредактировал(а) tishaishii - 15.2.2007, 07:23
PM MAIL ICQ Skype   Вверх
Zuzu
Дата 15.2.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нашел книжку, что давно хотел почитать.

Damian Conway: Object Oriented Perl 

Отсюда:
http://www.progteam.com/liter/?teh=Perl

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

Господа модераторы, решите, пожалуйста, что делать с этой ссылкой и насколько "пправильно" (со всех точек зрения) размещение этой ссылки здесь и вообще размещение этой ссылки.

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


Шустрый
*


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

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



Чесно говоря недавно сталкнулся с ООП в перле, более сложной и непонятной схемы не видел smile(я сравниваю с С++ и С#).  Хотя возможно это и к лучшему...

Это сообщение отредактировал(а) stan777 - 19.2.2007, 00:07
PM MAIL   Вверх
tishaishii
Дата 19.2.2007, 04:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Что, собственно, не понятно было?
Удивило bless? Ну так new, в принципе, по же самое делает.
PM MAIL ICQ Skype   Вверх
Zuzu
Дата 19.2.2007, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



stan777, было бы интересно сравнить на простых примерах, например реализацию парадигм ОО Программирования в C# и perl. Если тебе интересно, конечно, приведи простенькие примеры.

А еще лучше - подготовь маленькую диаграмку (в UML, например) того механизма, который ты хотел бы видеть в Perl и реализацию этого на C#. Я думаю, не мне одному будет интересно поразбираться. smile

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


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


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

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



А что там сравнивать-то? 1:1.
ООП, по-моему, имеет единую идеологию.
В конце-концов, я не в полне понимаю выражения "на уровне компилляции" и "на уровне выполнения". Всё равно, в итоге, происходит сравнение и всякие "если", даже, если это не было скомпилировано. Другое дело - скорость работы.
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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