標籤:
來源:
http://www.cnblogs.com/itech/archive/2012/08/21/2649580.html
Perl物件導向 首先讓我們來看看有關 Perl 物件導向編程的三個基本定義: 1. 一個“對象”是指一個“有辦法知道它是屬於哪個類”的簡單引用。(對象就是引用變數) 2. 一個“類”是指一個“有辦法給屬於它的對象提供一些方法”的簡單的包。(類就是包) 3. 一個“方法”是指一個“接受一個對象或者類名稱作為第一個參數”的簡單的子程式。(類的方法就是第一個參數為類名或對象的方法) 一個類只是一個簡單的包和 C++ 不同,Perl 並不為類定義提供任何特殊文法。實際上類只是一個包而已。你可以把一個包當作一個類用,並且把包裡的函數當作類的方法來用。不過,有一個特殊的數組,叫做 @ISA,它說明了“當 Perl 在當前包中找不到想要的方法時,應當繼續從哪兒去找”。這就是 Perl 實現“繼承”的關鍵。@ISA中的每個元素都是一個別的包的名字。當類找不到方法時,它會從 @ISA 數組中依次尋找(深度優先)。類通過訪問 @ISA 來知道哪些類是它的基類。 所有的類都有一個隱含的基類(祖先類):"UNIVERSAL"。"UNIVERSAL" 類為它的子類提供幾個通用的類方法。它提供以下幾個方法:isa,can。其中isa用來判斷變數是否從某個類繼承而來,can後面的參數則是一個方法,判斷這個方法是否在這個類或者基類中被定義。另外你可以給UNIVERSAL添加新的方法。一旦給它添加了新的方法,所有的class都可以調用。給UNIBERSAL添加新方法的例子:
1 sub UNIVERSAL::log()2 {3 my($self,$msg)=@_;4 print "$self: $msg\n";5 }
這樣就可以在每個類中調用這個函數,並且log之前會把類名列印出來。 對象僅僅只是引用Perl中的構造器只是一個子程式,該子程式返回一個被bless處理的引用,這個經過 bless 處理的引用就是人們所說的“對象”,而 bless 的作用就是用來說明這個對象是隸屬於哪個“類”。最簡單的構造器:
1 package Critter;2 sub new { bless {} }
如果你希望使用者不僅能夠用 "CLASS->new()" 這種形式來調用你的建構函式,還能夠以 "$obj->new()" 這樣的形式來調用的話,那麼就這麼做:
1 sub new {2 my $this = shift;3 my $class = ref($this) || $this; #ref支援了“$obj->new()”形式的調用(感覺是獲得類名)4 my $self = {};5 bless $self, $class;6 $self->initialize();7 return $self;8 }
一個方法就是一個簡單的子程式
方法把它被調用時的對象或者類名稱當作它的第一個參數。有兩種不同的調用方法的途徑,分別成為“調用類方法”和“調用執行個體方法”。類方法把類名當作第一個參數。它提供針對類的功能,而不是針對某個具體的對象的功能。構造器通常是一個類方法。大多數類方法簡單地忽略第一個參數,因為方法知道自己處在什麼類裡面,也不關心它是通過什麼類來調用的。Perl 提供了兩種不同的形式去調用一個方法。最簡單的形式是採用箭頭符號:
1 my $fred = Critter->find("Fred");2 $fred->display("Height", "Weight");
你可以早就熟悉了引用的 "->" 操作符。事實上,因為上面的 $fred是一個指向了對象的引用,因此你也可以把箭頭操作符理解為另外一種形式的解引用。 出現在箭頭左邊的引用或者類名,將作為第一個參數傳遞給箭頭右邊的方法。所以上面的代碼就分別相當於這樣:
1 my $fred = Critter::find("Critter", "Fred");2 Critter::display($fred, "Height", "Weight");
簡單樣本
簡單樣本1、說明本程式示範了在Perl中如何進行物件導向編程:示範程式包含兩個檔案:person.pl 和 person.pm,把 person.pl 和 person.pm 放在目前的目錄下,運行"perl person.pl"即可以看到結果。person.pm定義了名為person的類。person.pl中建立了person類的執行個體,並測試了person的成員方法。2、person.pm的內容#!/usr/bin/perl -wpackage person;use strict;sub new {my $class = shift();print("CLASS = $class\n");my $self = {}; $self->{"name"} = shift();$self->{"sex"} = shift();bless $self, $class;return $self; }sub getName {my ($self) = @_;return $self->{"name"};}sub setName {my ($self, $name) = @_;$self->{"name"} = $name;}sub getSex {my ($self) = @_;return $self->{"sex"};}sub setSex {my ($self, $sex) = @_;$self->{"sex"} = $sex;}3、person.pl的內容#!/usr/bin/perl -wuse strict;use person;sub main(){my $tom = person->new("Tom", "male");my $kiss = person->new("Kiss", "female");my @persons = ($tom, $kiss);for my $p (@persons) {printf("NAME: %s\tSEX: %s\n", $p->getName(), $p->getSex());}}&main();4、程式運行結果CLASS = personCLASS = personNAME: Tom SEX: maleNAME: Kiss SEX: female
來自:
http://bbs.chinaunix.net/thread-980909-1-1.html
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=770196
perl物件導向