Как я наследовал подпрограммы в Perl с 'основой использования'?

Я нашел решение

Мне пришлось удалить файл .HTACCESS на моем сервере. Этот файл содержит этот код:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

URL-адрес удерживается в «http //»

15
задан Machavity 19 September 2018 в 02:54
поделиться

6 ответов

C++ mechnics очень не отличается, чем механика Perl: Для использования наследования Вам нужны два класса: базовый класс и наследующий класс. Но у Вас нет происходящего класса.

Вы также испытываете недостаток в конструкторе. В отличие от C++, Perl не предоставит конструктора по умолчанию Вам.

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

Наконец, как tsee уже наблюдаемый, необходимо будет сообщить Perl, хотите ли Вы вызов функции или вызов метода.

То, что Вы действительно хотите, выглядело бы примерно так:

my $foo = TestDescendent->new();
$foo->main();


package TestBase;

sub new {
   my $class = shift;
   return bless {}, $class;
}

sub tbSub
{
   my ($self, $parm) = @_;
   print "\nTestBase: $parm\n";
}

package TestDescendent;
use base 'TestBase';

sub main {
    my $self = shift;
    $self->mySub( 1 );
    $self->tbSub( 2 );
    $self->mySub( 3 );
}

sub mySub
{
    my $self = shift;
    my $parm = shift;
    print "\nTester: $parm\n";
}

1;
23
ответ дан 1 December 2019 в 00:27
поделиться

Необходимо взглянуть на использование Американского лося, который является постмодернистской объектной системой для Perl5. Вы, вероятно, найдете намного легче схватить, чем использование стандартного Perl семантику OO... особенно при прибытии из другого языка OO.

Вот версия Американского лося Вашего вопроса....

package TestBase;
use Moose;

sub tbSub {
   my ($self, $parm) = @_;
   print "\nTestBase: $parm\n";
}


package TestDescendent;
use Moose;
extends 'TestBase';

sub main {
    my $self = shift;
    $self->mySub( 1 );
    $self->tbSub( 2 );
    $self->mySub( 3 );
}

sub mySub {
    my ($self, $parm) = @_;
    print "\nTester: $parm\n";
}


package main;
my $foo = TestDescendent->new();
$foo->main

Различия....

  • Конструктор, автоматически созданный для Вас и
  • Наследование, определенное, "расширяет" команду вместо "основы использования".

Таким образом, этот пример только покрывает подсказку айсберга Американского лося ;-)

10
ответ дан 1 December 2019 в 00:27
поделиться

Как заметка на полях, существует мало серьезного основания к use base вместо более нового use parent.

5
ответ дан 1 December 2019 в 00:27
поделиться

Синтаксис OO использует -> оператор для разделения сообщения и аргументов от получателя сообщения. Короткая иллюстрация ниже.

You->do_something( @params );

OR 

$you->do_something( @params );

package A;

sub do_neat_thing { 
    my ( $class_or_instance, @args ) = @_;
    my $class = ref( $class_or_instance );
    if ( $class ) {
         say "Instance of '$class' does a neat thing.";
    }
    else { 
        say "$class_or_instance does a neat thing.";
    }
}

...
package main;
A->do_neat_thing();      # A does a neat thing.
my $a_obj = A->new();
$a_obj->do_neat_thing();     # Instance of 'A' does a neat thing.
1
ответ дан 1 December 2019 в 00:27
поделиться

Наследование Perl наследовало методы, не функции. Это означает, что необходимо будет звонить

main->tbSub(2);

Однако то, что Вы действительно хотите, должно наследовать метод в надлежащий класс:

package Derived;
use base "TestBase";

package main;
Derived->somemethod("foo");

Вызывающие методы в текущем пакете как функции не передадут в $self или "этом" объекте, ни имени класса волшебно. Внутренне,

Class->somemethod("foo")

по существу заканчивает тем, что был назван как

Class::somemethod("Class", "foo")

внутренне. Конечно, это предполагает, что Класс имеет подпрограмму/метод, названную "somemethod". В противном случае суперклассы Класса будут проверены и если у этого не будет метода "somemethod" также, то Вы получите фатальную ошибку. (Та же логика запрашивает $obj-> метод ("нечто").)

4
ответ дан 1 December 2019 в 00:27
поделиться

Это кажется мне, Вы перепутываете две вещи здесь: объектно-ориентированный и Процедурный Perl. Perl OO довольно "отличается" (как в не господствующая тенденция, но осуществимый).

Ваш модуль TestBase.pm, кажется, ожидает быть выполненным как объект Perl (oo-стиль Perl), но Ваш сценарий Perl хочет получить доступ к нему как к "нормальному" модулю. Perl не работает способ, которым C++ делает (как Вы поняли), таким образом, необходимо будет создать код по-другому. См. книги Damian Conway для объяснений (и более умный код, чем мои ниже).


Процедурный:

#! /usr/bin/perl
#The module to inherit from

package TestBase;
  use strict;
  use warnings;

  use Exporter ();
  our @ISA         = qw (Exporter);
  our @EXPORT      = qw (tbSub);

#-------------------------------
sub tbSub
{
    my ($parm) = @_;
    print "\nTestBase: $parm\n";
}

1;

.

#! /usr/bin/perl
#The descendent class
use strict;
use warnings;

use TestBase; 
sub main;
sub mySub;

#-------------------------------
#Entry point...
main();

#---code------------------------
sub main
{

    mySub(1);
    tbSub(2);
    mySub(3);
}

#-------------------------------
sub mySub
{
    my $parm = shift;
    print "\nTester: $parm\n";
}

Perl OO

#! /usr/bin/perl
#The base class to inherit from

package TestBase;
  use strict;
  use warnings;

#-------------------------------
sub new { my $s={ };
    return bless $s;
}
sub tbSub
{
    my ($self,$parm) = @_;
    print "\nTestBase: $parm\n";
}

1;

.

#! /usr/bin/perl
#The descendent class
use strict;
use warnings;

use TestBase; 
sub main;
sub mySub;

#-------------------------------
#Entry point...
main();

#---code------------------------
sub main
{
    my $tb = TestBase->new();
    mySub(1);
    $tb->tbSub(2);
    mySub(3);
}

#-------------------------------
sub mySub
{
    my $parm = shift;
    print "\nTester: $parm\n";
}
5
ответ дан 1 December 2019 в 00:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: