使用子类中定义的变量的父方法

时间:2019-05-03 15:30:37

标签: perl oop inheritance

在Python中,您可以执行以下操作:

class Binance(Exchange):
    name = "Binance"
    code = "binance"

并且在父类中有

class Exchange:
    @classmethod
    def get_name(cls):
    return cls.name

现在是Perl!

这很可爱。我希望我的Perl对象也一样。

package DWDESReader;
use base qw(DWConfigFileReader);
our $type = "DES";

并在基类中:

package DWConfigFileReader;

our $type = "";

sub new {
    my ($class, %args) = @_;
    $args{type} = $type;

    return bless {%args}, $class;
}

sub getType {
    my ($self) = @_;
    return $self->{type};
}

但这是行不通的,即仅返回基类中分配的空字符串。我没想到它会起作用,但是不确定应该怎么做。

3 个答案:

答案 0 :(得分:4)

我不知道为什么需要它,但是如果您关闭strict refs,则有可能:

#!/usr/bin/perl
use warnings;
use strict;

{   package My::Base;

    sub new { bless {}, shift }
    our $name = 'Base';
    sub get_name {
        my ($self) = @_;
        my $class = ref $self || $self;
        do { no strict 'refs';
             ${ $class . '::name' }
         }
    }
}

{   package My::Child;
    use parent -norequire => 'My::Base';
    our $name = 'Child';
}

my $ch = 'My::Child'->new;
print $ch->get_name, ' ', 'My::Child'->get_name;

但是通常,您只需定义一个包含名称的类方法即可:

{   package My::Base;

    sub new { bless {}, shift }
    sub name { 'Base' }
    sub get_name { shift->name }
}

{   package My::Child;
    use parent -norequire => 'My::Base';
    sub name { 'Child' }
}

答案 1 :(得分:4)

在Perl中,类没有属性(变量),只有方法(子类)。

我建议创建一个抽象的虚拟类方法。

package DWConfigFileReader;

use Carp qw( croak );

sub new {
    my ($class, %args) = @_;
    my $self = bless(\%args, $class);
    return $self;
}

sub type { croak("Subclass must override \"type\"."); }

1;

package DWDESReader;

use parent 'DWConfigFileReader';

sub type { "DES" }

1;

您甚至不需要$self->{type} = $class->type;;只需使用$self->type而不是$self->{type}

答案 2 :(得分:3)

建议,Perl继承方法(子),而不是变量,但是常量实际上是子,因此您可以执行类似的操作。

package DWDESReader;
use base qw(DWConfigFileReader);
use constant TYPE => "DES";

然后,如果您在基类的某个位置调用$self->TYPE,则如果该对象实际上是DWDESReader对象,则将获得“ DES”。