2013-10-11 156 views
0

我想初始化一個基類和一個子類,而不必複製構造函數。這是我的了:Perl:使用基類和子類的公共構造函數

tstbase.pm:

package tstbase; 
use Exporter qw(import); 
our @EXPORT = qw(&new); 
my %config = (
    "class" => "tstbase", 
); 

sub new { 
    my $class = shift; 
    my $self; 
    $self->{"name"} = $config{"class"}; 
    bless ($self, $class); 
    return $self; 
}; 
1; 

tstsubclass.pm:

package tstsubclass; 
use tstbase; 
my %config = (
    "class" => "tstsubclass", 
); 
1; 

tst.pl:

#!/usr/bin/perl 
use tstsubclass; 

my $baseobj = tstbase->new; 
print "Testbase ".$baseobj->{"name"}."\n"; 
my $subobj = tstsubclass->new; 
print "Testsubclass ".$subobj->{"name"}."\n"; 

tst.pl的outout是

Testbase tstbase 
Testsubclass tstbase 

但是我正在尋找

Testbase tstbase 
Testsubclass tstsubclass 

,我是說我複製「亞新{..}」例行到tstsubclass.pm。有沒有辦法避免這種開銷?我嘗試過所有我的%配置/我們的%配置和導出%配置沒有成功的組合。

任何幫助是極大的讚賞

最佳, 馬庫斯

回答

3

你的構造函數是繼承,所以這是工作的罰款。不起作用的是您使用%config,它在每個軟件包中分別存在。因爲您調用基類中定義的構造函數,所以使用%config版本。在特定情況下,配置哈希是不必要的,因爲你可以通過使用$class變量到您的構造函數通過初始化name成員:

sub new { 
    my $class = shift; 
    my $self = { };  # initialize the object as a reference to an empty hash 
    $self->{"name"} = $class; 
    bless ($self, $class); 
    return $self; 
}; 

這將工作(儘管這是不必要的,你總是能獲得使用Scalar::Util::blessed的對象的類)。

但更常見的問題似乎是如何在繼承構造函數中使用特定於類的配置信息。一種方法是使用獨立的初始化步驟,可以在子類中重寫。

package tstbase; 

# we don't use Exporter for OO code; exporting methods is highly counterproductive. 
# we should also turn on strict and warnings. 
use strict; 
use warnings; 

my %config = (
    "class" => "tstbase", 
); 

sub new { 
    my $class = shift; 
    my $self; 
    bless $self, $class; 
    $self->_init(%config); 
    return $self; 
}; 

sub _init { 
    my $self = shift; 
    my %args = @_; 
    $self->{name} = $args{class}; 
} 

1; 

然後:

package tstsubclass; 
use parent 'tstbase'; # we have to say what class we're extending 

my %config = (
    "class" => "tstsubclass", 
); 

sub _init { 
    my $self = shift; 
    $self->SUPER::_init(%config); 
} 

1; 

在這種情況下,你的子類的_init方法將在父類,它調用父類的_init方法構造函數被調用,但通過在其本地%config

處理此問題的更簡單方法是使用mixins或Moose角色。

+0

感謝您的快速響應!正如您可能懷疑的那樣,我的目標不是能夠訪問類名,而是對類屬性執行一些複雜的初始化 - 我只是發佈了精簡的示例。原始的類構造函數有80行代碼。我會檢查這種方法是否能解決我的問題。 無論如何,你解決了這個問題,所以大拇指! – Marcus

相關問題