PERLBOOT 7
PERLBOOT
NAMEDESCRIPTION æè¿°
SEE ALSO åè§
COPYRIGHT
䏿çç»´æ¤äºº
ä¸æçææ°æ´æ°
䏿æå页翻è¯è®¡å
NAME
perlboot - åå¦èçé¢å对象æç¨
DESCRIPTION æè¿°
å¦æä½ å¯¹å¶ä»è¯è¨ä¸ç对象并ä¸çæçè¯, é£ä¹å¶ä»æå³perl对象çæä»¶å¯è½ä½¿ä½ æå°ææ§, æ¯å¦ perlobj , è¿æ¯åºç¡æ§çåèæä»¶, å perltoot, è¿æ¯ä»ç»perl对象çç¹æ§çæç¨.
æä»¥, 让æä»¬èµ°å¦ä¸æ¡è·¯,åå®ä½ 没æä»»ä½å³äºå¯¹è±¡çæ¦å¿µ. ä½ éè¦äºè§£åç¨åº (perlsub), å¼ç¨ (perlref et. seq.), å å(ææ¨¡å) (perlmod), 妿è¿ä¸æ¸æ¥çè¯,åæä»ä»¬ææ¸æ¥.
If we could talk to the animals...妿æä»¬è½åå¨ç©äº¤è°
让æä»¬è®©å¨ç©è®²ä¼å¿è¯:
sub Cow::speak {
print "a Cow goes moooo!\n";
}
sub Horse::speak {
print "a Horse goes neigh!\n";
}
sub Sheep::speak {
print "a Sheep goes baaaah!\n"
}
Cow::speak;
Horse::speak;
Sheep::speak;
ç»ææ¯:
a Cow goes
moooo!
a Horse goes neigh!
a Sheep goes baaaah!
没ä»ä¹ç¹å«ç. åªæ¯ç®åçåç¨åº, è½ç¶æ¥èªä¸åçå, å¹¶ç¨å®æ´çå忥è°ç¨. é£ä¹è®©æä»¬å»ºç«ä¸ä¸ªå®æ´çç§åºå§:
# Cow::speak,
Horse::speak, Sheep::speak ä¸ä¸å
@pasture = qw(Cow Cow Horse Sheep Sheep);
foreach $animal (@pasture) {
&{$animal."::speak"};
}
ç»ææ¯:
a Cow goes
moooo!
a Cow goes moooo!
a Horse goes neigh!
a Sheep goes baaaah!
a Sheep goes baaaah!
å¯. è¿éç符å·ä»£ç å¼ç¨æäºä¸å¤ªå¥½. æä»¬æ£ä¾èµäº "no strict subs" 模å¼, å¨ç¨å¤§äºçç¨åºä¸åºå°½éé¿å. é£ä¸ºä»ä¹è¦è¿æ ·å¢? å 为æä»¬è¦è°ç¨çå- ç¨åºå宿å¨çå似乿¯ä¸å¯åç.
ççæ¯è¿æ ·å?
Introducing the method invocation arrow è°ç¨æ¹æ³æ¶çç®å¤´ç¬¦å·
ç°å¨,æä»¬è¯´ "Class->method" æ¯è°ç¨äºå(ææ¨¡å)"Class"ä¸ç "method" æ¹æ³ã(Here, "Class" is used in its "category" meaning, not its "scholastic" meaning.) 䏿¯å¾åç¡®,ä¸è¿æä»¬ä¼ä¸æ¥ä¸æ¥çæ¥å. ç°å¨,å¯ä»¥è¿æ ·å:
# Cow::speak,
Horse::speak, Sheep::speak as before
Cow->speak;
Horse->speak;
Sheep->speak;
è¾åºä¸º:
a Cow goes
moooo!
a Horse goes neigh!
a Sheep goes baaaah!
è¿ä¸æ¯å¾æè¶£. 䏿 ·çå符,常é,没æåé. 使¯, ä¸åé¨åå¯ä»¥åå¼äº. 请ç:
$a =
"Cow";
$a->speak; # invokes Cow->speak
å! ç°å¨ååä¸åç¨åºåå¯ä»¥åå¼äº, æä»¬å¯ä»¥ç¨åéæ¥è¡¨ç¤ºåå. è¿æ ·,å¨ä½¿ç¨ "use strict refs" é¢ç¼è¯æä»¤æ¶ä¹å¯ä»¥æ£å¸¸å·¥ä½äº.
Invoking a barnyard å建ä¸ä¸ªç²å£æ£
ç°å¨è®©æä»¬æç®å¤´ç¨å°ç²å£æ£çä¾åä¸ï¼èä¾:
sub Cow::speak {
print "a Cow goes moooo!\n";
}
sub Horse::speak {
print "a Horse goes neigh!\n";
}
sub Sheep::speak {
print "a Sheep goes baaaah!\n"
}
@pasture =
qw(Cow Cow Horse Sheep Sheep);
foreach $animal (@pasture) {
$animal->speak;
}
ç°å¨æä»¬ææçå¨ç©é½è½è¯´è¯äº, èä¸ä¸ç¨ä½¿ç¨ä»£ç å¼ç¨.
ä¸è¿æ³¨æå°é£äºç¸åç代ç . æ¯ä¸ª "speak" åç¨åºçç»ææ¯ç¸åç: ä¸ä¸ª "print" æä½ç¬¦åä¸ä¸ªåºæ¬ç¸åçå符串ï¼åªæä¸¤ä¸ªè¯ä¸å. 妿æä»¬å¯ä»¥æåºç¸åçé¨åå°±æ´å¥½äºï¼å¦æå°æ¥è¦æ "goes" æ¿æ¢ä¸º "says" æ¶å°±ç®åå¾å¤äº
å®éä¸è¿å¹¶ä¸å°é¾, ä¸è¿å¨è¿ä¹åæä»¬åºè¯¥å¯¹ç®å¤´ç¬¦å·äºè§£çæ´å¤ä¸äº.
The extra parameter of method invocation æ¹æ³è°ç¨æ¶çé¢å¤åæ°
è¯å¥:
Class->method(@args)
è¿æ ·è°ç¨å½æ° "Class::method"ï¼
Class::method("Class", @args);
(妿åç¨åºæ¾ä¸å°,"ç»§æ¿ï¼inheritance" å¼å§èµ·ä½ç¨,è¿å¨åé¢ä¼è®²å°). è¿æå³çæä»¬å¾å°ç第ä¸ä¸ªåæ°æ¯ç±»å(å¦ææ²¡æç»åºå¶ä»åæ°ï¼å®å°±æ¯è°ç¨æ¶çå¯ä¸åæ°).æä»¥æä»¬å¯ä»¥è±¡è¿æ·éå "Sheep" speaking åç¨åº:
sub Sheep::speak
{
my $class = shift;
print "a $class goes baaaah!\n";
}
å¦å¤çå¨ç©ä¸æ¤ç±»ä¼¼:
sub Cow::speak {
my $class = shift;
print "a $class goes moooo!\n";
}
sub Horse::speak {
my $class = shift;
print "a $class goes neigh!\n";
}
æ¯æ¬¡ $class é½ä¼å¾å°ä¸åç¨åºç¸å³çæ£ç¡®çå¼. 使¯,è¿æ¯æå¾å¤ç¸ä¼¼çç»æ. å¯ä»¥åç®åäºå? æ¯ç. å¯ä»¥éè¿å¨ä¸ä¸ªç±»ä¸è°ç¨å¶å®çæ¹æ³æ¥å®ç°.
Calling a second method to simplify things è°ç¨å¦ä¸ä¸ªæ¹æ³ä»¥ç®åæä½
æä»¬å¨ "speak" ä¸è°ç¨ "sound". è¿ä¸ªæ¹æ³æä¾å£°é³çå容.
{ package Cow;
sub sound { "moooo" }
sub speak {
my $class = shift;
print "a $class goes ", $class->sound,
"!\n"
}
}
ç°å¨, 彿们è°ç¨ "Cow->speak" æ¶, æä»¬å¨ "speak" ä¸å¾å° "Cow" çç±» $class. ä»ä¼éæ© "Cow->sound" æ¹æ³, ç¶åè¿å "moooo". é£å¦ææ¯ "Horse" å¢?
{ package Horse;
sub sound { "neigh" }
sub speak {
my $class = shift;
print "a $class goes ", $class->sound,
"!\n"
}
}
ä»ä»ååå声鳿åå. å æ¤æä»¬å¯ä»¥å¨CowåHorseä¸å±ç¨ "speak" å? æ¯ç,éè¿ç»§æ¿å®ç°!
Inheriting the windpipes ç»§æ¿æ°ç®¡
æä»¬å建ä¸ä¸ªå¬å±å½æ°å,å½å为 "Animal",å¨å¶ä¸å®ä¹ "speak":
{ package
Animal;
sub speak {
my $class = shift;
print "a $class goes ", $class->sound,
"!\n"
}
}
ç¶å,卿¯ä¸ªå¨ç©é£é "ç»§æ¿ï¼inherits" "Animal" ç±», åæ¶èµäºæ¯ä¸ªå¨ç©åèªç声é³:
{ package Cow;
@ISA = qw(Animal);
sub sound { "moooo" }
}
注æå¢å çæ°ç» @ISA . æä»¬é©¬ä¸è®²å°å®.
ç°å¨å½æä»¬è°ç¨ "Cow->speak" æ¶ä¼åçä»ä¹?
é¦å, Perlæé åæ°å表. å¨è¿ç§æåµä¸, åªæ "Cow". ç¶åPerl æ¥æ¾ "Cow::speak". 使¯æ¾ä¸å°, æä»¥Perlæ£æ¥ç»§æ¿æ°ç» @Cow::ISA. æ¾å°äº, é£éåªæä¸ä¸ª "Animal"
Perl ç¶åå¨ "Animal" 䏿¥æ¾ "speak", "Animal::speak". æ¾å°äº, ç¶åè°ç¨è¯¥åç¨åº, åæ°å¨ä¸å¼å§å°±è¢«åºå®äº.
å¨åç¨åº "Animal::speak" ä¸, $class æ¯ "Cow" (第ä¸ä¸ªåæ°). 卿们è°ç¨ "$class->sound" æ¶, é¦åå¯»æ¾ "Cow->sound" , æ¾å°äº, å æ¤ä¸ç¨æ¥ç @ISA. æå!
å³äº@ISAåºè¯¥æ³¨æçå ç¹é®é¢
ç¥å¥ç @ISA åé (è¯»ä½ "is a" è䏿¯ "ice-uh"), 声æäº "Cow" æ¯ä¸ä¸ª("is a") "Animal"ã æ³¨æå®æ¯ä¸ä¸ªæ°ç»,è䏿¯ä¸ä¸ªåå¼, å 为å¨ä¸ªå«æåµä¸, éè¦å¨å 个ç¶ç±»ä¸å¯»æ¾æ¹æ³.
妿 "Animal" 乿ä¸ä¸ª @ISA, æä»¬ä¹è¦æ¥çå®. å¯»æ¾æ¯éå½ç,深度ä¼å,卿¯ä¸ª @ISA ä¸ä»å·¦å°å³å¯»æ¾. ä¸è¬å°,æ¯ä¸ª @ISA åªæä¸ä¸ªåç´ (å¤åç´ æå³çå¤ç»§æ¿åå¤éç头ç), è¿æ ·æä»¬å¯ä»¥å¾å°ä¸ä¸ªæ¼äº®çç»§æ¿æ .
å¦æä½¿ç¨ "use strict", @ISAä¼å¼èµ·æ±æ¨, å 为å®ä¸æ¯å«ææ¾å¼ååçåé, ä¹ä¸æ¯åå¸åé ("my"). æä»¬ä¸è½æå®ç¨å"my"åé(å®å¿é¡»å±äºæç»§æ¿çå),使¯ä¹è¿æ¯æå ç§è§£å³çåæ³.
æç®åçåæ³æ¯å ä¸åå:
@Cow::ISA = qw(Animal);
æè使ç¨å声æ:
package Cow;
use vars qw(@ISA);
@ISA = qw(Animal);
å¦æä½ å¸ææåæ¾å°ç¨åºå, å¯ä»¥æ:
package Cow;
use Animal;
use vars qw(@ISA);
@ISA = qw(Animal);
ç®å为:
package Cow;
use base qw(Animal);
è¿å°±ç²¾ç®å¤äº.
Overriding the methods æ¹æ³éè½½
让æä»¬æ·»ä¸ä¸åªèé¼ , å®ç声é³å·®ä¸å¤å¬ä¸å°:
# Animal package
from before
{ package Mouse;
@ISA = qw(Animal);
sub sound { "squeak" }
sub speak {
my $class = shift;
print "a $class goes ", $class->sound,
"!\n";
print "[but you can barely hear it!]\n";
}
}
Mouse->speak;
è¾åºä¸º:
a Mouse goes
squeak!
[but you can barely hear it!]
å¨è¿é, "Mouse" æå®èªå·±çspeak 彿°, æä»¥ "Mouse->speak" ä¸ä¼è°ç¨"Animal->speak". è¿å«åéè½½ "overriding". å®éä¸, æä»¬çè³ä¸ç¨è¯´"Mouse" æ¯ "Animal", å 为 "speak" æç¨å°çæææ¹æ³å¨ "Mouse" ä¸é½æå®ä¹.
使¯æäºä»£ç ä¸ "Animal->speak" çç¸å , è¿å¨ç¨åºç»´æ¤æ¶æ¯ä¸ªé®é¢. æä»¬è½ä¸è½è®© "Mouse" ä¸å¶å® "Animal" ä½ç¸åçäº,使¯ç»å®å ä¸ç¹æ®çé¨åå¢? å¯ä»¥!
é¦å,æä»¬å¯ä»¥ç´æ¥è°ç¨ "Animal::speak" æ¹æ³:
# Animal package
from before
{ package Mouse;
@ISA = qw(Animal);
sub sound { "squeak" }
sub speak {
my $class = shift;
Animal::speak($class);
print "[but you can barely hear it!]\n";
}
}
注ææä»¬å¿é¡»ä½¿ç¨ $class (å ä¹è¯å®æ¯"Mouse") ä½ä¸º "Animal::speak" ç第ä¸ä¸ªåæ°, å 为æä»¬æ²¡æç¨ç®å¤´ç¬¦å·. é£ä¸ºä»ä¹ä¸ç¨å¢? å¯, 妿æä»¬å¨é£å¿è°ç¨ "Animal->speak", å第ä¸ä¸ªåæ°æ¯ "Animal" è䏿¯ "Mouse" , è¿æ ·å½è°ç¨ "sound" æ¶, å°±æ¾ä¸å°æ£ç¡®ç彿°äº.
è½ç¶å¦æ¤,ç´æ¥è°ç¨ "Animal::speak" ç¡®å®ä¸æä¹å¥½. ä¸ä¸ "Animal::speak" ä¸åå¨, èæ¯ç»§æ¿èª @Animal::ISA ä¸çæä¸ªç±»å¢? å 为没æä½¿ç¨ç®å¤´ç¬¦å·, æä»¬åªæä¸æ¬¡æºä¼å»è°ç¨æ£ç¡®ç彿°.
è¿è¦æ³¨æå°,ç°å¨ç±»å "Animal" ç´æ¥å¨åç¨åºä¸ä½¿ç¨. å¦æç»´æ¤ä»£ç çäººæ²¡ææ³¨æå°è¿ä¸ç¹, æ¹åäº <Mouse> ç @ISAï¼æ²¡ææ³¨æå° "speak" ç¨å°äº "Animal" é£å°±ä¼åºé®é¢. å æ¤, è¿å¯è½ä¸æ¯ä¸ä¸ªå¥½æ¹æ³.
Starting the search from a different place ä»å¶å®å°æ¹å¼å§å¯»æ¾
è¾å¥½çè§£å³åæ³æ¯è®©Perlä»ç»§æ¿é¾çä¸ä¸çº§å¼å§å¯»æ¾:
# same Animal as
before
{ package Mouse;
# same @ISA, &sound as before
sub speak {
my $class = shift;
$class->Animal::speak;
print "[but you can barely hear it!]\n";
}
}
è¿å°±å¯¹äº. 使ç¨è¿ä¸è¯æ³, æä»¬ä» "Animal" å¯»æ¾ "speak", 卿¾ä¸å°æ¶å¯»æ¾ "Animal" çç»§æ¿é¾.ä¸ç¬¬ä¸ä¸ªåæ°æ¯ $class, æä»¥ "speak" å"Mouse::sound" é½ä¼è¢«æ£ç¡®å°è°ç¨.
ä½è¿è¿ä¸æ¯æå¥½çæ¹æ³.æä»¬è¿å¿é¡»è°æ´ @ISA çåç´ é¡ºåº. æ´ç³ç³çæ¯, 妿 "Mouse" æå¤ä¸ªç¶ç±»å¨ @ISA, æä»¬è¿è¦ç¥éåªä¸ªç±»å®ä¹äº "speak". é£ä¹,ææ²¡ææ´å¥½çåæ³å¢?
The SUPER way of doing things 使ç¨SUPERæ¹æ³
éè¿æ "Animal" æ¹æ "SUPER" ç±», ç¨åºå¯ä»¥èªå¨å¨ææç¶ç±»ä¸(@ISA):
# same Animal as
before
{ package Mouse;
# same @ISA, &sound as before
sub speak {
my $class = shift;
$class->SUPER::speak;
print "[but you can barely hear it!]\n";
}
}
"SUPER::speak" æå³çå¨å½ååç @ISA ä¸å¯»æ¾ "speak", è°ç¨ç¬¬ä¸ä¸ªæ¾å°ç彿°ã注æå®ä¸ä¼æ¥æ¾ $class ç @ISA
Where we’re at so far...å°ç°å¨ä¸ºæ¢æä»¬å¦äºäºä»ä¹
æä»¬å·²ç»çå°äºç®å¤´ç¬¦å·è¯æ³:
Class->method(@args);
åå®ççä»·å½¢å¼:
$a =
"Class";
$a->method(@args);
å®ä»¬æé è¿æ ·ä¸ä¸ªåæ°å表:
("Class", @args)
å¹¶è°ç¨
Class::method("Class", @Args);
使¯ï¼å¦ææ¾ä¸å° "Class::method", ç¨åºä¼æ¥ç @Class::ISA (éå½ç) æ¾å°ä¸ä¸ªåå« "method" çå,ç¶åæ§è¡å®.
使ç¨è¿ç§ç®åçè¯æ³, æä»¬å¯ä»¥æç±»æ¹æ³,(å¤)ç»§æ¿,éè½½,以åå¶å®æ©å±. ä½¿ç¨æä»¬å·²ç»å¦å°çä¸è¥¿, æä»¬å¯ä»¥æåºå¬å±ç代ç ,以åç§ä¸åçå½¢å¼éç¨åä¸å·¥å·. è¿æ¯å¯¹è±¡è½å¤æä¾çæ ¸å¿å容, 使¯å¯¹è±¡è¿è½å¤æä¾å®ä¾æ°æ®, è¿ä¸ç¹æä»¬è¿æ²¡ææ¶å.
A horse is a horse, of course of course -- or is it? 马就æ¯é©¬ââççæ¯è¿æ ·å?
æä»¬ä» "Animal" å "Horse" ç±»ç代ç å¼å§:
{ package
Animal;
sub speak {
my $class = shift;
print "a $class goes ", $class->sound,
"!\n"
}
}
{ package Horse;
@ISA = qw(Animal);
sub sound { "neigh" }
}
è¿æ ·ä½¿å¾æä»¬è°ç¨ "Horse->speak"ï¼ä»èåä¸è°ç¨ "Animal::speak"ï¼ç¶åè°ç¨ "Horse::sound" æ¥è·å¾æå®ç声é³ï¼è¾åºä¸º:
a Horse goes neigh!
使¯æä»¬ææç马齿¯ç¸åç. 妿æå¢å ä¸ä¸ªåç¨åº, ææç马é½ä¼å±äº«å®. è¿å¨å建ç¸åç马æ¶ç¡®å®ä¸é, 使¯æä»¬å¦ä½è½å¤åºåä¸åç马å¢? æ¯å¦, åè®¾ææ³ç»æç第ä¸å¹é©¬èµ·ä¸ªåå. åºè¯¥æåæ³ä½¿å¾å®çåååå«ç马çååä¸å.
è¿å¯ä»¥éè¿å建ä¸ä¸ª "å®ä¾,instance" æ¥å®ç°. å®ä¾æ¯ç±ç±»å建ç. å¨Perlä¸, ä»»ä½å¼ç¨é½å¯ä»¥æ¯å®ä¾, 就让æä»¬ä»æç®åçå¼ç¨å¼å§å§,ä¸ä¸ªæ éå¼ç¨:
my $name =
"Mr. Ed";
my $talking = \$name;
ç°å¨ $talking æ¯æåå®ä¾ç¹ææ°æ®( $name )çå¼ç¨ãæè¿ä¸ªå¼ç¨åæçæ- £çå®ä¾çæ¯ä¸ä¸ªç¹æ®çæä½ç¬¦,å«å "bless":
bless $talking, Horse;
è¿ä¸ªæä½ç¬¦æåå "Horse" ä¸çææä¿¡æ¯åæ¾å°å¼ç¨ææåçä¸è¥¿ä¸. è¿æ¶,æä»¬è¯´ $talking æ¯ "Horse" çä¸ä¸ªå®ä¾ . ä¹å°±æ¯è¯´, 宿¯ä¸å¹ç¬ç¹ç马. å¼ç¨å¹¶æ²¡ææ¹å, è¿å¯ä»¥ç¨äºé´æ¥å¼ç¨æä½ç¬¦.
Invoking an instance method è°ç¨å®ä¾æ¹æ³
ç®å¤´ç¬¦å·å¯ä»¥ç¨äºå®ä¾. é£ä¹, å¬å¬ $talking ç声é³å§:
my $noise = $talking->sound;
è¦è°ç¨ "sound", Perl é¦å注æå° $talking æ¯ä¸ä¸ª blessed å¼ç¨ (å æ- ¤æ¯ä¸ä¸ªå®ä¾). å®ä¼æé ä¸ä¸ªåæ°å表, ç°å¨åªæ $talking. (å¨å颿们ä¼çå°åæ°ä»¬å¨å®ä¾åéä¹å, ä¸ä½¿ç¨ç±»æ¶ç¸ä¼¼.)
ç¶å,æ¯çæ£æææçé¨å: Perl æ¥æ¾å®ä¾æå±çç±», è¿éæ¯ "Horse", å¨å¶ä¸- 寻æ¾å¯¹åºçæ¹æ³. è¿é, "Horse::sound" ç´æ¥å¯ä»¥æ¾å°(ä¸ç¨ä½¿ç¨ç»§æ¿), æåè¿æ ·è°ç¨:
Horse::sound($talking)
注æè¿éç第ä¸ä¸ªåæ°è¿æ¯å®ä¾æ¬èº«, èä¸åå颿们å¦å°çæ¯ç±»å. æåè¿å弿¯ "neigh", å®è¢«èµå¼ç» $noise åé.
妿æ¾ä¸å° Horse::sound, ä¼å¨ @Horse::ISA åè¡¨ä¸æ¥æ¾. ç±»æ¹æ³ä¸å®ä¾æ¹æ³çå¯ä¸åºå«æ¯è°ç¨æ¶ç第ä¸ä¸ªåæ°æ¯å®ä¾(ä¸ä¸ªblessedå¼ç¨)è¿æ¯ä¸ä¸ªç±»å(ä¸ä¸ªå- 符串).
Accessing the instance data 访é®å®ä¾æ°æ®
å 为æä»¬å¾å°ç第ä¸ä¸ªåæ°æ¯å®ä¾,æä»¬å¯ä»¥è®¿é®å®ä¾ç¹æçæ°æ®. æä»¬å¯ä»¥åå¾é©¬çåå:
{ package Horse;
@ISA = qw(Animal);
sub sound { "neigh" }
sub name {
my $self = shift;
$$self;
}
}
ç°å¨,æä»¬è°ç¨åå:
print $talking->name, " says ", $talking->sound, "\n";
å¨ "Horse::name" ä¸, @_ æ°ç»ä»å«æ $talking, shift å° $talking èµç»äº $self. (ä¼ ç»ä¸æä»¬å¨å¤çå®ä¾æ¹æ³æ¶æ»æ¯æç¬¬ä¸ä¸ªåç´ èµç» $self, æä»¥ä½ ä¹åºè¯¥è¿ä¹å, é¤éä½ æä¸è¿æ ·åçååçç±.) ç¶å, $self 被æ éå,æä¸º "Mr. Ed", è¿å°±è¡äº. è¾åºæ¯:
Mr. Ed says neigh.
How to build a horse å¦ä½å建ä¸å¹é©¬
å½ç¶å¦,妿æä»¬æå·¥å建ææç马, æä»¬ä¼åºå¾å¤é误. ä¸ä»å¦æ- ¤,æä»¬è¿äºµæ¸äºé¢å对象ç¼ç¨çç¹æ§,å 为å¨é£ç§æåµä¸é©¬ç"åè"ä¹å¯è§äº. å¦æä½ æ¯å½å»çè¯,è¿åæ£å¥½, 坿¯å¦æä½ ä»ä»æ¯ä¸ªç±é©¬èå¢? æä»¥,æä»¬è®© Horse ç±»æ¥å建ä¸å¹æ°é©¬:
{ package Horse;
@ISA = qw(Animal);
sub sound { "neigh" }
sub name {
my $self = shift;
$$self;
}
sub named {
my $class = shift;
my $name = shift;
bless \$name, $class;
}
}
ç°å¨,æä»¬å¯ä»¥ç¨ "named" æ¹æ³å建ä¸å¹é©¬:
my $talking = Horse->named("Mr. Ed");
注æå°æä»¬æåå°äºç±»æ¹æ³, æä»¥ä¼ éç» "Horse::named" çä¸¤ä¸ªåæ°æ¯ "Horse" å "Mr. Ed". "bless" æä½ç¬¦ä¸ä»å° $name å®ä¾å, ä¸å°æå $name çå¼ç¨ä½ä¸ºè¿åå¼è¿å. è¿æ ·, æä»¬å°±å建äºä¸å¹é©¬.
è¿é,æä»¬è°ç¨äºæé å¨ "named", å®çåæ°å°±æ¯ç¹å®ç "Horse" çåå. ä½ å¯ä»¥ä½¿ç¨ä¸åçæé å¨ç¨ä¸åçåå建ç«ä¸åç对象(æ¯å¦è®°å½å®ç谱系æçæ¥). 使¯, ä½ ä¼åç°å¤æ°ä½¿ç¨Perlç人æ´å欢ææé å¨å½å为 "new", 并使ç¨ä¸åçæ¹æ³è§£é "new" çåæ°. 两ç§é½æºå¥½,åªè¦ä½ è½å建对象就è¡. (ä½ ä¼èªå·±å建ä¸ä¸ª,对å?)
Inheriting the constructor ç»§æ¿æé å¨
使¯é£ä¸ªæ¹æ³ä¸ææ²¡æä»ä¹å¯¹äº "Horse" æ¥è¯´æ¯è¾ç¹æ®çä¸è¥¿å¢? 没æ. å æ- ¤, ä» "Animal" å建å¶å®ä»»ä½ä¸è¥¿ä¹å¯ä»¥ä½¿ç¨ç¸åçæ¹æ³,æä»¬æ¥è¯è¯::
{ package
Animal;
sub speak {
my $class = shift;
print "a $class goes ", $class->sound,
"!\n"
}
sub name {
my $self = shift;
$$self;
}
sub named {
my $class = shift;
my $name = shift;
bless \$name, $class;
}
}
{ package Horse;
@ISA = qw(Animal);
sub sound { "neigh" }
}
好äº, 使¯ä»¥å®ä¾è°ç¨ "speak" ä¼äº§çä»ä¹ç»æå¢?
my $talking =
Horse->named("Mr. Ed");
$talking->speak;
æä»¬å¾å°çæ¯:
a Horse=SCALAR(0xaca42ac) goes neigh!
为ä»ä¹?å 为 "Animal::speak" 叿å®ç第ä¸ä¸ªåæ°æ¯ç±»å, è䏿¯å®ä¾. å½å®ä¾è¢«ä¼ 奿¶,æä»¬å¸æä½¿ç¨çæ¯å- 符串è䏿¯å®ä¾æ¬èº«,æ¾ç¤ºçç»æä¸æ¯æä»¬æå¸æç.
Making a method work with either classes or instances ä½¿æ¹æ³åæ¶æ¯æç±»åå®ä¾
æä»¬éè¦åçæ¯è®©æ¹æ³æ£æµå®æ¯è¢«å®ä¾è°ç¨çè¿æ¯è¢«ç±»è°ç¨ç. æç´æ¥çæ¹æ³æ¯ä½¿ç¨ "ref" æä½ç¬¦. å®å¨åæ°æ¯å®ä¾æ¶è¿åå- 符串,å¨åæ°æ¯ç±»åæ¶è¿å "undef". æä»¬é¦åæ¹å "name" æ¹æ³:
sub name {
my $either = shift;
ref $either
? $$either # it’s an instance, return name
: "an unnamed $either"; # it’s a class,
return generic
}
å¨è¿å¿, "?:" æä½ç¬¦å³å®æ¯éæ©é´æ¥å¼ç¨(dereference)è¿æ¯æ´¾çå符串. ç°å¨æä»¬å¯ä»¥åæ¶ä½¿ç¨ç±»æå®ä¾äº. 注ææä¿®æ¹äºç¬¬ä¸ä¸ªåæ°ä¸º $either æ¥è¡¨ç¤ºææçåå:
my $talking =
Horse->named("Mr. Ed");
print Horse->name, "\n"; # prints "an
unnamed Horse\n"
print $talking->name, "\n"; # prints "Mr
Ed.\n"
æä»¬å¯ä»¥æ¹å "speak" :
sub speak {
my $either = shift;
print $either->name, " goes ",
$either->sound, "\n";
}
è "sound" æ¬æ¥å°±å¯ä»¥å·¥ä½. é£ä¹ç°å¨å°±ä¸å宿äº!
Adding parameters to a method ç»æ¹æ³å åæ°
让æä»¬è®ç»å¨ç©ä»¬åé¥:
{ package
Animal;
sub named {
my $class = shift;
my $name = shift;
bless \$name, $class;
}
sub name {
my $either = shift;
ref $either
? $$either # it’s an instance, return name
: "an unnamed $either"; # it’s a class,
return generic
}
sub speak {
my $either = shift;
print $either->name, " goes ",
$either->sound, "\n";
}
sub eat {
my $either = shift;
my $food = shift;
print $either->name, " eats $food.\n";
}
}
{ package Horse;
@ISA = qw(Animal);
sub sound { "neigh" }
}
{ package Sheep;
@ISA = qw(Animal);
sub sound { "baaaah" }
}
è¯è¯å§:
my $talking =
Horse->named("Mr. Ed");
$talking->eat("hay");
Sheep->eat("grass");
è¾åºä¸º:
Mr. Ed eats hay.
an unnamed Sheep eats grass.
æåæ°çå®ä¾æ¹æ³è°ç¨æ¶é¦åå¾å°å®ä¾çå¼ç¨ï¼ç¶åå¾å°åæ°çå表ãå æ- ¤ç¬¬ä¸ä¸ªè°ç¨å®é䏿¯è¿æ ·ç:
Animal::eat($talking, "hay");
More interesting instances æ´å¤æè¶£çå®ä¾
妿å®ä¾éè¦æ´å¤çæ°æ®è¯¥æä¹åå¢? æ´å¤ç项ç®äº§çæ´æè¶£çå®ä¾, æ¯ä¸ªé¡¹ç®å¯ä»¥æ¯ä¸ä¸ªå¼ç¨æèçè³æ¯ä¸ä¸ªå¯¹è±¡. æç®åçæ¹æ³æ¯æå®ä»¬å- æ¾å°åå¸ä¸. åå¸ä¸çå³é®è¯å«å’å®ä¾åé"(instance variables)æè"æååé"(member variables)ï¼ç¸åºçå¼ä¹å°±æ¯åéçå¼ã
使¯æä»¬æä¹æé©¬æ¾å°åå¸ä¸å¢? åå¿å°å¯¹è±¡æ¯è¢«å®ä¾å(blessed)çå¼ç¨. æä»¬å¯ä»¥ç®åå°å建ä¸ä¸ªç¥ç¦äºçåå¸å¼ç¨,åæ¶ç¸å³ççå容ä¹ä½äºä¿®æ¹å°±å¯ä»¥äº.
让æä»¬å建ä¸åªæååæé¢è²ç绵ç¾ï¼
my $bad = bless { Name => "Evil", Color => "black" }, Sheep;
é£ä¹ "$bad->{Name}" æ¯ "Evil", "$bad->{Color}" æ¯ "black". 使¯æä»¬æ³éè¿ "$bad->name" åå绵ç¾çååname, è¿æç¹çé®é¢,å 为ç°å¨å®ææä¸ä¸ªæ éå¼ç¨. 嫿å¿,å 为修æ£å®å¾ç®å:
## in Animal
sub name {
my $either = shift;
ref $either ?
$either->{Name} :
"an unnamed $either";
}
"named" å½ç¶è¿æ¯å建æ éç绵ç¾, å¦ä¸ä¿®æ£å°±å¥½äº:
## in Animal
sub named {
my $class = shift;
my $name = shift;
my $self = { Name => $name, Color =>
$class->default_color };
bless $self, $class;
}
é»è®¤é¢è² "default_color" æ¯ä»ä¹? å¯, 妿 "named" åªæä¸ä¸ªåæ°name, æä»¬è¿æ¯å¸ææä¸ªé¢è², æä»¥æä»¬è®¾å®ä¸ä¸ªç±»åå§åé¢è². å¯¹ç»µç¾æ¥è¯´, ç½è²æ¯è¾å¥½:
## in Sheep
sub default_color { "white" }
为äºé¿å为æ¯ä¸ªç±»å®ä¹é¢è², æä»¬å¯ä»¥å¨ "Animal" ä¸å®ä¹ä¸ä¸ª "缺çç缺çï¼backstop" çé¢è²:
## in Animal
sub default_color { "brown" }
ç°å¨, å ä¸ºåªæ "name" å "named" ä¸å¯¹è±¡ç "ç»æï¼structure" ç¸å³, å¶ä½çé¨åå¯ä»¥ä¿æä¸å, æä»¥ "speak" 工使£å¸¸.
A horse of a different color ä¸å¹ä¸åé¢è²ç马
使¯å¦æææç马齿¯æ£è²ç,乿ºç¦äººç. æä»¥æä»¬å¯ä»¥åä¸ªæ¹æ³æ¥æ¹å马çé¢è².
## in Animal
sub color {
$_[0]->{Color}
}
sub set_color {
$_[0]->{Color} = $_[1];
}
注æå°åååæ°çä¸åæ¹æ³äºå: $_[0] ç´æ¥ä½¿ç¨, èæ²¡æç¨ "shift". (è¿å¨æä»¬é¢ç¹ååæ¶å¯ä»¥èçä¸äºæ¶é´.) ç°å¨æä»¬å¯ä»¥æMr. Edçé¢è²åè¿æ¥:
my $talking =
Horse->named("Mr. Ed");
$talking->set_color("black-and-white");
print $talking->name, " is colored ",
$talking->color, "\n";
ç»ææ¯:
Mr. Ed is colored black-and-white
Summary æ»ç»
ç°å¨æä»¬è®²äºç±»æ¹æ³,æé å¨,å®ä¾æ¹æ³,å®ä¾æ°æ®,çè³è¿æååå¨(accessor). 使¯è¿äºè¿ä»ä»æ¯å¼å§. æä»¬è¿æ²¡æè®²å°ä»¥ä¸¤ä¸ªå½æ° getters,setters å½¢å¼åºç°çååå¨ï¼ææå¨(destructor),é´æ¥å¯¹è±¡(indirect object notation),åç±»(subclasses that add instance data),per-class data,éè½½(overloading),"isa" å "can" æµè¯,å¬å±ç±»("UNIVERSAL" class),ç- ç. è¿æå¾å¶å®ææ¡£å»è®²è§£äº. æ 论å¦ä½,å¸ææ¬æä½¿ä½ å¯¹å¯¹è±¡ææäºè§£.
SEE ALSO åè§
æ´å¤ä¿¡æ¯å¯åè§ perlobj (è¿éææ´å¤çPerl对象çç»è,èæ¬æçæ¯åºç¡), perltoot (é¢å对象çä¸çº§æç¨), perlbot (æ´å¤çæå·§), 以å书ç±,æ¯å¦Damian Conwayçä¸éç书å«åãé¢å对象çPerl (Object Oriented Perl)ãã
æäºæ¨¡åå¯è½å¯¹ä½ æç¨ï¼å®ä»¬æ¯ Class::Accessor, Class::Class, Class::Contract, Class::Data::Inheritable, Class::MethodMaker è¿æ Tie::SecureHash
COPYRIGHT
Copyright (c) 1999, 2000 by Randal L. Schwartz and Stonehenge Consulting Services, Inc. Permission is hereby granted to distribute this document intact with the Perl distribution, and in accordance with the licenses of the Perl distribution; derived documents must include this copyright notice intact.
Portions of this text have been derived from Perl Training materials originally appearing in the Packages, References, Objects, and Modules course taught by instructors for Stonehenge Consulting Services, Inc. and used with permission.
Portions of this text have been derived from materials originally appearing in Linux Magazine and used with permission.
䏿çç»´æ¤äºº
redcandle <redcandle51@chinaren.com>
ä¸æçææ°æ´æ°
2001å¹´12æ9æ¥æææ¥
䏿æå页翻è¯è®¡å
http://cmpp.linuxforum.net
è·
æ¬é¡µé¢ä¸æçç±ä¸æ
man
æå页计åæä¾ã
䏿 man
æå页计åï¼https://github.com/man-pages-zh/manpages-zh