timurko
1

Вызов метода не определенного в классе

21.03.2013, 22:05. Показов 984. Ответов 4
Метки нет (Все метки)

Доброго времени суток. Волей судьбы необходимо разобраться в одной программе написанной на perl. При разборе исходников столкнулся вот с какой проблемой. Имеется строка
my $var = ААА::ВВВ->new();
но вот беда, в
package ААА::ВВВ;
нет метода new.
Гуру perla подскажите, куда копать, где же эта собака new может быть зарыта?

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2013, 22:05
Ответы с готовыми решениями:

Вызов метода в классе из другого
Не получается выполнить следующую цепочку действий. Запускаю метод в классе B через main, он...

Вызов статического метода класса в другом классе
Как вызвать статический метод из одного класса в другом? вот этот код не работает class A{...

Не работает вызов метода PDO в дочернем классе
Есть класс: class Device { public static $device = array('id', 'name', 'type', 'buyDate',...

В производном классе вызов приватного метода базового класса
Добрый вечер. Помогите понять одну вещь. Имеется такое наследование: class test1 { public: ...

4
351 / 221 / 25
Регистрация: 30.09.2012
Сообщений: 548
22.03.2013, 13:10 2
В ААА::ВВВ случайно нет строк вида
Perl
1
2
3
use Kakoetoimya;
...
@ISA = qw(Kakoetoimya);
В этом случае те методы, которые не определены в Ваше классе, будут браться из родительского Kakoetoimya.
0
Невнимательный
459 / 379 / 132
Регистрация: 08.02.2013
Сообщений: 1,058
Записей в блоге: 2
22.03.2013, 15:14 3
если подробнее, то new может вызываться из другого файла
, насколько смог понять, возможно присутствует
Perl
1
2
package ААА::ВВВ;
use parent 'AAA';
или
Perl
1
2
package ААА::ВВВ;
use base 'AAA';
Возможно другими способами вызвать use/require, и импортировать метод new из другого модуля
Возможно просто сделать что-то вроде *{new} = \&{ИмяSub}, но тогда ИмяSub должно инициировать объект, используя bless.
0
timurko
22.03.2013, 15:37 4
Perl
1
2
3
@ISA = qw(Kakoetoimya);
use parent 'AAA';
use base 'AAA';
Таких строк в файле нет, но есть
Perl
1
use Moo;
я сегодня пошарил по гуглу и так понял что эта штука переопределяет new() и может вызывать
Perl
1
sub BUILD
Я на верном пути?
Спасибо за помощь!
Невнимательный
459 / 379 / 132
Регистрация: 08.02.2013
Сообщений: 1,058
Записей в блоге: 2
22.03.2013, 17:55 5
поищите bless в этих файлах
my $var = ААА::ВВВ->new(); присваевает переменной ссылку на объект.

Даже не знаю бывает-ли new вшитым в бинарные XS-модули, или как их назвать, те которые лежат в ./lib/auto/ и ./site/lib/auto/ ни разу не замечал такого, тогда наверное в .pm можно было-бы найти только bootstrap

Добавлено через 41 минуту
нашёл это Moo .)
так оно собственно и сделано для того что-бы создавать модули без new
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
40
41
42
43
44
45
46
47
48
49
50
=pod
 
=encoding utf-8
 
=head1 NAME
 
Moo - Minimalist Object Orientation (with Moose compatiblity)
 
=head1 SYNOPSIS
 
 package Cat::Food;
 
 use Moo;
 
 sub feed_lion {
   my $self = shift;
   my $amount = shift || 1;
 
   $self->pounds( $self->pounds - $amount );
 }
 
 has taste => (
   is => 'ro',
 );
 
 has brand => (
   is  => 'ro',
   isa => sub {
     die "Only SWEET-TREATZ supported!" unless $_[0] eq 'SWEET-TREATZ'
   },
 );
 
 has pounds => (
   is  => 'rw',
   isa => sub { die "$_[0] is too much cat food!" unless $_[0] < 15 },
 );
 
 1;
 
And elsewhere:
 
 my $full = Cat::Food->new(
    taste  => 'DELICIOUS.',
    brand  => 'SWEET-TREATZ',
    pounds => 10,
 );
 
 $full->feed_lion;
 
 say $full->pounds;
Там куча файлов .pm файлов участвует, в частности Moo::_Utils занимается экспортом методов.

Добавлено через 16 минут
или это в файле Object.pm
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sub new {
  my $class = shift;
  unless (exists $NO_DEMOLISH{$class}) {
    unless ($NO_DEMOLISH{$class} = !$class->can('DEMOLISH')) {
      ($DEMOLISH_MAKER ||= do {
        require Method::Generate::DemolishAll;
        Method::Generate::DemolishAll->new
      })->generate_method($class);
    }
  }
  $NO_BUILD{$class} and
    return bless({ ref($_[0]) eq 'HASH' ? %{$_[0]} : @_ }, $class);
  $NO_BUILD{$class} = !$class->can('BUILD') unless exists $NO_BUILD{$class};
  $NO_BUILD{$class}
    ? bless({ ref($_[0]) eq 'HASH' ? %{$_[0]} : @_ }, $class)
    : do {
        my $proto = ref($_[0]) eq 'HASH' ? $_[0] : { @_ };
        bless({ %$proto }, $class)->BUILDALL($proto);
      };
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2013, 17:55

Постоянный вызов метода основного класса в наследованном классе
Всем привет! Вопрос про наследование. Можно сделать так, чтобы при вызове в производном классе...

Вызов метода в классе формы из класса другого проекта
Есть проект Project1 и Project2 - оба ClassLibrary. В Project1 происходит вызов форми из Project2...

Вызов метода базового класса игнорируя переопределенный метод в производном классе
Как вызвать метод базового класса игнорируя переопределенный метод в производном классе. PS...

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.