Bu sorun neden bazı insanlar new
yönteminizde ilginç bir şey yapmamanızı öneririz. new
'un kutsanmış bir başvuru oluşturması ve döndürmesi beklenir; bu, farklı nesne sınıflarından aynı nesne için bunu iki kez gerçekleştiren bir sistem oluşturmak zor olur.
Daha temiz bir seçenek, yalnızca nesneyi oluşturan ve nesneyi oluşturabilecek başka bir yöntemi çağırmak için yeni bir yönteme sahip olmaktır. Bu ikinci yöntem, birden çok üst yöntemin çağrılmasına izin verecek şekilde davranabilir. Etkili new
siz ayırdediciniz ve bu diğer yöntem sizin kurucunuz.
package Mother;
use strict;
use warnings;
sub new {
my ($class, @args) = @_;
my $self = bless {}, $class;
return $self->_init(@args);
}
sub _init {
my ($self, @args) = @_;
# do something
return $self;
}
package Father;
use strict;
use warnings;
sub new {
my ($class, @args) = @_;
my $self = bless {}, $class;
return $self->_init(@args);
}
sub _init {
my ($self, @args) = @_;
# do something else
return $self;
}
package Child;
use strict;
use warnings;
use base qw(Mother Father);
sub _init {
my ($self, @args) = @_;
# do any thing that needs to be done before calling base classes
$self->Mother::_init(@args); # Call Mother::_init explicitly, SUPER::_init would also call Mother::_init
$self->Father::_init(@args); # Call Father::_init explicitly, SUPER::_init would NOT call Father::_init
# do any thing that needs to be done after calling base classes
return $self;
}
Eter, birden fazla kalıtım kullanarak bulmanız olası karmaşıklıklarla ilgili haklıdır. Yine de, Father::_init
'un, başlamak için Mother::_init
tarafından verilen tüm kararları geçersiz kılmayacağını bilmeniz gerekir. Oradan ayıklamak sadece daha karmaşık ve daha zor olacak.
Moose numaralı öneriye başvurmak isterim; arabirimi, nesne oluşturma ve başlatma işleminin daha iyi bir şekilde ayrılmasını ve yukarıdaki örnekte yaptığımdan genellikle işe yarar.
sayesinde bu işleri şeye benim şimdiki kod dönüştürmek için en kolay yolu gibi görünüyor. – Zitrax