Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用子类中定义的变量的父方法_Perl_Oop_Inheritance - Fatal编程技术网

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

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

在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};
}

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

我不明白为什么需要它,但如果你关闭参考文献,它是可能的:

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

{   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的回答中那样喜欢常量而不是子类?常量实际上是作为子类实现的,所以我们的答案并没有那么大的不同。常量的优点是它们可以作为编译时优化的一部分,但在它们被称为方法的情况下就不行了,所以这并不是一个非常显著的区别。如果预期某些类型可能是可变的,那么我实际上更喜欢池上的方法 而不是常量,但如果值真的被理解为类常量,我更喜欢我的值。