在Python中,您可以执行以下操作:
class Binance(Exchange):
name = "Binance"
code = "binance"
并且在父类中有
class Exchange:
@classmethod
def get_name(cls):
return cls.name
这很可爱。我希望我的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};
}
但这是行不通的,即仅返回基类中分配的空字符串。我没想到它会起作用,但是不确定应该怎么做。
答案 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”。