2016-05-21 77 views
2

我有兩個類,一類是基礎類(員工),另一個它的子類繼承了其它(延長),其的代碼如下所示:繼承在Perl

package Employee; 
require Exporter; 
our @EXPORT = ("getattr"); 

our $private = "This is a class level variable"; 

sub getattr { 
    print "Inside the getattr function of Employee.pm module \n"; 
    $self = shift; 
    $attr = shift; 
    return ($self->{$attr}); 
} 
1; 

===== ===========

package Extend; 

use base qw(Employee); 

sub new { 
    print "Inside new method of Employee.pm \n"; 
    my $class = shift; 
    my %data = (
       name => shift, 
       age => shift, 
       ); 

    bless \%data , $class; 
} 

sub test { 
    print "Inside test method of Extend class \n"; 
} 

1; 

==================

現在我的代碼另一塊其使用Extend班級:

use Extend; 

my $obj = Extend->new("Subhayan",30); 
my $value = $obj->getattr("age"); 
print ("The value of variable age is : $value \n"); 
$obj->test(); 
print "Do i get this : $obj.$private \n"; 

我的問題是關於在父類中定義的變量$ private。按照我的繼承的概念,父類的屬性和方法應該可以通過子類對象獲得。例如,函數getattr運行良好。但是,爲什麼我無法使用基類Extend對象訪問$ private變量。

我在這裏錯過了什麼?有人可以幫忙嗎?

+0

請注意,您在此處使用'Exporter'不正確。導出和繼承是兩個完全獨立的機制,如果你正在編寫面向對象的代碼,那麼你不需要'Exporter'。爲公共屬性編寫特定的訪問方法也許更好,因爲你的getattr允許直接訪問所有的實例變量,而不管它們是公開的還是私有的。在調用代碼 – Borodin

回答

1

變量不會以與subs相同的方式繼承。要訪問它,你需要指定整個軟件包的名稱(是的,當你聲明$private,你需要our,不my):

print "$Employee::private\n"; 

它更強大的定義存取方法:

# Employee package 
sub private { 
    return $private; 
} 

...然後在你的腳本:

my $var = private(); 

要繼承對象從公司員工屬性,你可以這樣做:

# Employee 

sub new { 
    my $self = bless { 
     dept => 'HR', 
     hours => '9-5', 
    }, shift; 

    return $self; 
} 

# Extend 

sub new { 
    my $class = shift; 
    my $self = $class->SUPER::new; # attrs inherited from Employee 
    $self->{extended} = 1; 
    return $self; 
} 

# script 

my $extend = Extend->new; 

現在$extend樣子:

{ 
    dept => 'HR', 
    hours => '9-5', 
    extended => 1, 
} 

你很可能不會設置部門或小時,因爲這將適用於所有僱員的基類,但我離題。

+0

Helllo @Stevieb中編寫'$ obj - > {'attr'}'只是一個小小的改進。感謝您的答覆 。那麼如何繼承屬性在Perl中工作。 Perl中可以繼承的類的屬性是什麼? –

+0

我已經更新了我的答案,以包含一種繼承對象屬性的方法。 – stevieb

+0

謝謝@stevieb,但按照您所示的方式,我們不必繼承Employee類。如果我們替換$ class-> SUPER :: new();用Employee-> new()。除了使用SUPER並調用超類的構造函數之外,沒有其他方法可以通過哪些方法自動導入方法? –