117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Наследование переменных в Perl28.09.2013, 00:44. Показов 1725. Ответов 18
Метки нет (Все метки)
Доброго всем!
Не могу понять как организовать наследование переменных в Perl Допустим, есть три класса и каждый класс - это отдельный файл: Class.pm
Другими словами, чтобы перед тем как будет вновь создана переменная c именем $a в текущем пакете (*Class2::a) нужно чтобы интерпретатор\компилятор проверил существование переменной с таким именем в другом пакете\классе, указанном в @ISA текущего пакета\класса. Есть ли способы? Заранее спасибо за идеи и критику ( куда же без неё ) ! P.S. Ах да? Чуть не забыл ...
Городить в каждом классе экспорт переменных не хочется. Хотелось бы автоматически наследовать переменные. P.P.S. Код Perl 5
0
|
28.09.2013, 00:44 | |
Ответы с готовыми решениями:
18
Как у PERL c ООП? Можно ли создавать классы, наследование и т.д.? Передача переменных между скриптами perl и shell Наследование переменных Наследование переменных |
352 / 222 / 25
Регистрация: 30.09.2012
Сообщений: 548
|
||||||
28.09.2013, 14:31 | 2 | |||||
А так устроит?
0
|
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
|
|
28.09.2013, 19:39 [ТС] | 3 |
Вы предлагаете использовать подпрограммы для доступа, хм...
Тут будет возвращена переменная $a из пакета Class Если определить $a в пакете Class1, то всё равно обращение будет к переменной в классе Class так как метод get_a расположен (будет найден) в Class, а мне нужно чтобы переменная $a при её отсутствии в вызывающем пакете, искалась в ближайшем пакете. То есть, если я вызываю $Class2::a и её тут нет, то далее идем в $Class1::a и так далее по цепочке наследования. Ломаю голову уже больше недели Добавлено через 3 часа 22 минуты Вопрос открыт... Ещё есть идеи? Если найти способ нормально наследовать переменные в Perl, то это может быть весомым аргументом в пользу Perl как языка вообще ;-) (ИМХО)
0
|
352 / 222 / 25
Регистрация: 30.09.2012
Сообщений: 548
|
||||||
29.09.2013, 17:07 | 4 | |||||
Можете ещё вот так попробовать
0
|
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
|
||||||
29.09.2013, 17:29 [ТС] | 5 | |||||
Очень похоже на то, что 'a' теперь это метод доступа к $a
И боюсь, что программа упадёт при объявлении подпрограммы с одноименным именем 'a'. То есть, вот так сделать будет нельзя, если я всё правильно понимаю.
0
|
352 / 222 / 25
Регистрация: 30.09.2012
Сообщений: 548
|
||||||
29.09.2013, 17:35 | 6 | |||||
Тогда попробуйте так
0
|
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
|
|
29.09.2013, 17:46 [ТС] | 7 |
Да, это работает, но выглядит не очень и опять же работа идёт через методы гетеры\сетеры + ещё что то.
Кроме того, может быть падение производительности, раз так в 5, судя по тому, что пишут в сети. Я думаю, что должны быть ещё варианты наследовать переменные. Например, при обращении к переменной, может вызываться какая то функция, в которой можно как то обработать вызов, просмотреть пакеты, указанные в @ISA текущего пакета, а так же его предков. Что то вроде того. Добавлено через 45 секунд Под функцией я имею ввиду нативный обработчик Perl
0
|
352 / 222 / 25
Регистрация: 30.09.2012
Сообщений: 548
|
|
29.09.2013, 17:52 | 8 |
Допишите сеттер в первом варианте, который я Вам предложил. Вполне нативный вариант и не требует дополнительных библиотек.
0
|
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
|
|
29.09.2013, 18:04 [ТС] | 9 |
Так наследоваться будут методы, а не поля класса.
Где метод будет найдет, из такого пакета и будет взята переменная. Получается, что нужно вручную переносить поля(переменные) класса, да ещё и методы доступа.
0
|
352 / 222 / 25
Регистрация: 30.09.2012
Сообщений: 548
|
||||||
29.09.2013, 18:14 | 10 | |||||
Ну и где я в Class1 или в Class2 что-то вручную переношу
0
|
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
|
||||||
29.09.2013, 18:21 [ТС] | 11 | |||||
Объявите переменную $a в пакете Class1 и попробуйте её унаследовать.
То есть, что бы при таком коде:
0
|
352 / 222 / 25
Регистрация: 30.09.2012
Сообщений: 548
|
||||||
29.09.2013, 20:20 | 12 | |||||
Вот объявление переменной в Class1
0
|
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
|
|
29.09.2013, 20:24 [ТС] | 13 |
pka, ну я об этом и написал выше, что чтобы унаследовать от ClassN нужно в нем определить как переменную так и методы доступа к ней.
А мне хочется, что переменная наследовалась ... При обращении к $Class2::a бралась из $Class1::a если её нет в Class2.
0
|
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
|
|
01.10.2013, 03:39 [ТС] | 14 |
Вопрос открыт Perl программисты
0
|
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
|
|
04.10.2013, 00:09 [ТС] | 15 |
UP!
Ребят, нужны идеи! Я понимаю, что Perl программисты народ скромный, но всё же =) Как заставить интерпретатор наследовать переменные от одного класса к другому ?
0
|
04.10.2013, 03:55 | 16 | ||||||||||||||||||||
Но ведь оно так и происходит, только ты её извлекаешь не оператором присваивания а своей функцией.
Class.pm
0
|
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
|
|
04.10.2013, 04:07 [ТС] | 17 |
СашаН, Это не совсем то ... тут наследуется метод, который извлекает данные из хэша (если коротко).
Мы как бы все данные инкапсулировали и доступаемся до них через методы родительского класса. А я имею ввиду такой же механизм наследования переменных (статических), как подпрограмм(функций) через, например, массив @ISA. Есть ли такой способ?
0
|
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
|
|
05.10.2013, 08:54 [ТС] | 18 |
Просмотров всё больше, ответов не прибавляется, печалька ...
Может есть способ использовать сигналы? ($SIG{__WARN__} = sub { ... } ) Для обработки того чтобы перехватить неопределенную переменную в текущем пакете? У кого какие мысли? И ещё, кто работал с переменной ${^WARNING_BITS} и знает как её использовать для перехвата warning - ов Я знаю, что её юзает прагма warnings; Но как и что, пока не разобрался. То есть, если обобщить, то как вариант, использовать перехват обращения к переменной, чтобы вызвать подпрограмму, которая займется наследованием имен переменных. Что скажете? (ногами не пинать) Добавлено через 4 часа 8 минут UP
0
|
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
|
|
24.10.2013, 14:42 [ТС] | 19 |
Вообщем, я так понял, что наследование переменных в Perl можно организовать только через методы доступа.
Наверное, можно ещё что нибудь придумать, но чётких вариантов пока нет. Тему можно закрывать.
0
|
24.10.2013, 14:42 | |
24.10.2013, 14:42 | |
Помогаю со студенческими работами здесь
19
Наследование переменных от интерфейса Наследование переменных класса Наследование нескольких переменных Наследование медотов, переменных из другой формы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |