Perl 使用子类中定义的变量的父方法
在Python中,您可以执行以下操作:Perl 使用子类中定义的变量的父方法,perl,oop,inheritance,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(DWConfigFileRea
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};
}
但这不起作用,即只返回在基类中分配的空字符串。我没想到它会起作用,但我不确定该怎么做。我不明白为什么需要它,但如果你关闭参考文献,它是可能的: 但通常,您只需定义一个包含以下名称的类方法:
{ 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' }
}
我不明白人们为什么需要它,但如果你关闭refs: 但通常,您只需定义一个包含以下名称的类方法:
{ 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' }
}
正如所建议的,Perl继承方法子类,而不是变量,但常量实际上是子类,所以您可以执行类似的操作
package DWDESReader;
use base qw(DWConfigFileReader);
use constant TYPE => "DES";
然后,如果调用基类中的某个地方的$self->TYPE,如果对象实际上是一个DWDESReader对象,则会得到DES。正如所建议的那样,Perl继承方法subs,而不是变量,但常量实际上是subs,因此可以执行类似的操作
package DWDESReader;
use base qw(DWConfigFileReader);
use constant TYPE => "DES";
然后,如果在基类中的某个地方调用$self->TYPE,如果对象实际上是一个DWDESReader对象,则会得到DES。类在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;
您甚至不需要$self->{type}=$class->type;;只需使用$self->type而不是$self->{type}。类在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;
您甚至不需要$self->{type}=$class->type;;只需使用$self->type而不是$self->{type}。为什么需要它?变量不是继承的,只是方法。为什么需要它?变量不是遗传的,只有方法;但是,在父级的构造函数中,我检查是否设置了给定的文件参数,如果没有设置,我会对着提到类型的用户发出咯咯声。如果存在$args{file}{croak$self->type.file未设置;}。这与基类$self->type中的情况不同,它会导致重写发出嘎嘎声。我当然可以在基类中设置一些虚假信息,比如'config'。但这并不是我想要的。有什么想法吗?@bluppfisk,听起来你不正确地使用了bless。请参阅我答案中的代码。首先将$self重新定义为一个受祝福的类,然后再设置其属性。不,这只是我的风格选择,以便基类和派生类的构造函数看起来相同。这根本不是问题所在。但是,它确实意味着您必须在知道可以创建对象之前创建一个对象,或者使用$class->type,只要type是作为类方法而不是对象方法调用的字符串是一个非常好的发票-Foo->new用作Foo->new的快捷方式,毕竟——只要这是该方法所期望的;但是,在父级的构造函数中,我检查是否设置了给定的文件参数,如果没有设置,我会对着提到类型的用户发出咯咯声。如果存在$args{file}{croak$self->type.file未设置;}。这与基类$self->type中的情况不同,它会导致重写发出嘎嘎声。我当然可以在基类中设置一些虚假信息,比如'config'。但这并不是我想要的。有什么想法吗?@bluppfisk,听起来你不正确地使用了bless。请参阅我答案中的代码。首先将$self重新定义为一个受祝福的类,然后再设置其属性。不,这只是我的风格选择,以便基类和派生类的构造函数看起来相同。这根本不是问题所在。但是,它确实意味着您必须在知道可以创建对象之前创建一个对象,或者使用$class->type,只要type是作为类方法而不是对象方法调用的字符串是一个非常好的发票-Foo->new用作Foo->new的快捷方式,毕竟——只要这是方法所期望的。有什么理由像ikegami的答案那样,你更喜欢常量而不是子类吗?常量实际上是作为子类实现的,所以我们的答案没有那么大的不同。常量的优点是它们可以作为编译时优化的一部分,但在它们被称为方法的情况下就不行了,所以这并不是一个非常显著的区别。如果预计某些类型可能是可变的而不是常量,我实际上更喜欢ikegami的方法,但如果值真的被理解为类常量,我更喜欢我的方法。有什么理由像ikegami的回答中那样喜欢常量而不是子类?常量实际上是作为子类实现的,所以我们的答案并没有那么大的不同。常量的优点是它们可以作为编译时优化的一部分,但在它们被称为方法的情况下就不行了,所以这并不是一个非常显著的区别。如果预期某些类型可能是可变的,那么我实际上更喜欢池上的方法 而不是常量,但如果值真的被理解为类常量,我更喜欢我的值。