Форум программистов, компьютерный форум, киберфорум
Perl
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
1

Наследование переменных в Perl

28.09.2013, 00:44. Показов 1725. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго всем!
Не могу понять как организовать наследование переменных в Perl
Допустим, есть три класса и каждый класс - это отдельный файл:

Class.pm
Perl
1
2
3
4
package Class;
our $a = 5;
 
1;
Class1.pm
Perl
1
2
3
4
5
package Class1;
use Class;
@Class1::ISA = ('Class');
 
1;
Class2.pm
Perl
1
2
3
4
5
6
7
package Class2;
use Class1;
@Class2::ISA = ('Class1');
 
print $a;
 
1;
Как при такой цепочке наследования обратиться к переменной $a скажем в файле Class2.pm ???
Другими словами, чтобы перед тем как будет вновь создана переменная c именем $a в текущем пакете (*Class2::a)
нужно чтобы интерпретатор\компилятор проверил существование переменной с таким именем в другом пакете\классе, указанном в @ISA текущего пакета\класса.
Есть ли способы?
Заранее спасибо за идеи и критику ( куда же без неё ) !
P.S.
Ах да? Чуть не забыл ...
Perl
1
2
3
4
# ...
use Exporter 'import';
@EXPORT = qw/ $a /;
# ...
такого рода вещи не предлагайте, плиз.
Городить в каждом классе экспорт переменных не хочется.
Хотелось бы автоматически наследовать переменные.

P.P.S.
Код Perl 5
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2013, 00:44
Ответы с готовыми решениями:

Как у PERL c ООП? Можно ли создавать классы, наследование и т.д.?
Как у PERL c ООП? Можно ли создавать классы, наследование и т.д.?

Передача переменных между скриптами perl и shell
Есть shell-скрипт, который вызывает скрипт на perl (в нём разбирается эл.письмо со вложенным...

Наследование переменных
Добрый день! Задам столь facepalm'ный :wall: вопрос. Пытаюсь разобраться с наследованием в VB.Net и...

Наследование переменных
Делаю первые шаги в программировании. Есть процедура с параметрами, я хочу ее разбить на небольшое...

18
352 / 222 / 25
Регистрация: 30.09.2012
Сообщений: 548
28.09.2013, 14:31 2
А так устроит?
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!perl
 
{
    package Class;
    our $a = 5;
    sub new {
        bless [ ], shift;
    }
    sub get_a {
        return $a;
    }
    1;
}
 
{
    package Class1;
    our @ISA = qw(Class);
    1;
}
 
{
    package Class2;
    our @ISA = qw(Class1);
    1;
}
 
package Main;
 
use strict;
use warnings;
 
my $obj = Class2->new();
print $obj->get_a();
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
Можете ещё вот так попробовать
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!perl
 
{
    package Class;
    use Moose;
    has 'a' => (
        is => 'rw',
        default => 5,
    );
    1;
}
 
{
    package Class1;
    use Moose;
    extends 'Class';
    1;
}
 
{
    package Class2;
    use Moose;
    extends 'Class1';
    1;
}
 
package Main;
use Moose;
use strict;
use warnings;
 
my $obj = Class2->new();
print $obj->a, "\n"; # здесь выводиться по умолчанию
$obj->a(15); # задаётся новое значение
print $obj->a, "\n";
0
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
29.09.2013, 17:29  [ТС] 5
Очень похоже на то, что 'a' теперь это метод доступа к $a
И боюсь, что программа упадёт при объявлении подпрограммы с одноименным именем 'a'.

То есть, вот так сделать будет нельзя, если я всё правильно понимаю.
Perl
1
2
3
4
5
6
7
8
9
10
package Class;
    use Moose;
    has 'a' => (
        is => 'rw',
        default => 5,
    );
    sub a {
    ...
    }
    1;
0
352 / 222 / 25
Регистрация: 30.09.2012
Сообщений: 548
29.09.2013, 17:35 6
Цитата Сообщение от PetyaVasechkin Посмотреть сообщение
при объявлении подпрограммы с одноименным именем 'a'
Тогда попробуйте так
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!perl
 
{
    package Class;
    use Moose;
    has 'a' => (
        is => 'rw',
        reader => 'get_a', 
        writer => 'set_a',
        default => 5,
    );
    1;
}
 
{
    package Class1;
    use Moose;
    extends 'Class';
    1;
}
 
{
    package Class2;
    use Moose;
    extends 'Class1';
    1;
}
 
package Main;
use Moose;
use strict;
use warnings;
 
my $obj = Class2->new();
print $obj->get_a(), "\n"; # здесь выводиться по умолчанию
$obj->set_a(15); # задаётся новое значение
print $obj->get_a, "\n";
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
Цитата Сообщение от PetyaVasechkin Посмотреть сообщение
Под функцией я имею ввиду нативный обработчик Perl
Допишите сеттер в первом варианте, который я Вам предложил. Вполне нативный вариант и не требует дополнительных библиотек.
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
Цитата Сообщение от PetyaVasechkin Посмотреть сообщение
нужно вручную переносить поля(переменные) класса, да ещё и методы доступа
Ну и где я в Class1 или в Class2 что-то вручную переношу
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!perl
 
{
    package Class;
    our $a = 5;
    sub new {
        bless { }, shift;
    }
    sub get_a {
        return $a;
    }
    sub set_a {
        my $self = shift;
        $a = shift;
    }
    1;
}
 
{
    package Class1;
    our @ISA = qw(Class);
    1;
}
 
{
    package Class2;
    our @ISA = qw(Class1);
    1;
}
 
package Main;
 
use strict;
use warnings;
 
my $obj = Class2->new();
print $obj->get_a(), "\n";
$obj->set_a(28);
print $obj->get_a(), "\n";
0
117 / 117 / 0
Регистрация: 27.09.2013
Сообщений: 710
29.09.2013, 18:21  [ТС] 11
Объявите переменную $a в пакете Class1 и попробуйте её унаследовать.
То есть, что бы при таком коде:
Perl
1
2
3
4
5
6
7
8
package main;
use strict;
use warnings;
 
use Class2;
 
my $object = Class2->new;
print $object->get_a; # возвращалась $a из пакета Class1 , а не из Class.
0
352 / 222 / 25
Регистрация: 30.09.2012
Сообщений: 548
29.09.2013, 20:20 12
Вот объявление переменной в Class1
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!perl
 
{
    package Class;
    sub new {
        bless { }, shift;
    }
    1;
}
 
{
    package Class1;
    our @ISA = qw(Class);
    our $a = 8;
    sub get_a {
        return $a;
    }
    sub set_a {
        my $self = shift;
        $a = shift;
    }
    1;
}
 
{
    package Class2;
    our @ISA = qw(Class1);
    1;
}
 
package Main;
 
use strict;
use warnings;
 
my $obj = Class2->new();
print $obj->get_a(), "\n";
$obj->set_a(20);
print $obj->get_a(), "\n";
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
349 / 299 / 166
Регистрация: 15.03.2012
Сообщений: 653
Записей в блоге: 1
04.10.2013, 03:55 16
Цитата Сообщение от PetyaVasechkin Посмотреть сообщение
что чтобы унаследовать от ClassN нужно в нем определить как переменную так и методы доступа к ней.
А мне хочется, что переменная наследовалась ...
При обращении к $Class2::a бралась из $Class1::a если её нет в Class2.
Но ведь оно так и происходит, только ты её извлекаешь не оператором присваивания а своей функцией.

Class.pm
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package Class;
 
sub new
{
   my $class = shift;
   my $temp = shift;
   if (defined($temp)) {}
   else {$temp = 5}
   my $self = {
      a => $temp,
   };
   bless $self, $class;
   return $self;
}
 
sub a
{
   my ( $self ) = shift;
   if (defined (my $temp = shift)) {
      $self->{a} = $temp;
   }
   return $self->{a};
}
 
1;
Class1.pm
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
package Class1;
use Class;
our @ISA = qw(Class);
 
sub a {
   my ($self) = shift;
   if (defined(my $temp = shift)) {
      $self->{a} = $temp;
   }
   return $self->{a}*2;
}
 
1;
Class2.pm
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
package Class2;
use Class1
our @ISA = qw(Class1);
 
#sub a {
#   my ($self) = shift;
#   if (defined(my $temp = shift)) {
#      $self->{a} = $temp;
#   }
#   return $self->{a}*3;
#}
 
1;
Main.pl
Perl
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
use v5.14;
use warnings;
use Class2;
 
 
my $obj  = new Class2();
say $obj ->a();
print $obj->a(2),"\n";
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2013, 14:42
Помогаю со студенческими работами здесь

Наследование переменных от интерфейса
Задача на засыпку Почему так работает template <class T> class A { public:...

Наследование переменных класса
Добрый день. Имею класс P1 с некоторыми переменными. В ходе работы программы эти переменные...

Наследование нескольких переменных
Имеются 3 класса (computer, pc, pda). pc должен наследовать от computer 2 переменных, а pda от pc...

Наследование медотов, переменных из другой формы
Подскажите, плиз, как осуществляется наследование сабжа в VB? Т.е. в одной форме (Form1) я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru