我已經寫了一些Perl代碼,它們構成了基本固有的兩個類。我想這將打印像這樣爲什麼perl對象實例互相覆蓋
Mik: Meow! Meow!
Sat: Woof! Woof!
但實際打印這種方式:
Sat: Woof! Woof!
Sat: Woof! Woof!
,
package Animal;
sub new {
my $obj = shift;
my $name = shift;
our %pkg = ('name' => $name);
bless \%pkg, $obj;
return \%pkg;
}
package Cat;
@ISA = ("Animal");
sub new {
my $obj = shift;
my $name = shift;
my $self = $obj->SUPER::new($name);
return $self;
}
sub get_name {
my $obj = shift;
return $obj->{'name'};
}
sub talk {
my $obj = shift;
return "Meow! Meow!";
}
package Dog;
@ISA = ("Animal");
sub new {
my $obj = shift;
my $name = shift;
my $self = $obj->SUPER::new($name);
return $self;
}
sub get_name {
my $obj = shift;
return $obj->{'name'};
}
sub talk {
my $obj = shift;
return "Woof! Woof!";
}
package Main;
my $cat = new Cat('Mike');
my $dog = new Dog('Sat');
print $cat->get_name() . ": " . $cat->talk() , "\n";
print $dog->get_name() . ": " . $dog->talk() , "\n";
但如果我改變這樣的調用者,它打印什麼我想是。所以在$dog
實例化之後爲什麼$cat
對象被覆蓋很奇怪?
package Main;
my $cat = new Cat('Mily');
print $cat->get_name() . ": " . $cat->talk() , "\n";
my $dog = new Dog('Sat');
print $dog->get_name() . ": " . $dog->talk() , "\n";
嗯,是的。良好的OO設計總是很難;語言能做的最好的不是妨礙你的行爲。但我認爲Moose可以更容易地感受到設計的正確性。以上面的例子。'talk'是一種方法,但它實際上只是一個屬性。因此它應該是基類中的一個方法,它在子類中使用另一個屬性。我發現很難以舊式的形式看到這樣的東西。 – innaM
@innaM非常感謝您的幫助。讓我解釋一下。 1.我真的很困惑,我的Dog實例覆蓋了我的貓,所以我想查看每個類的細節。我並不是要在每個類中定義get_name。 2.我曾經使用過很多很老的Unix機器,所以我必須在Perl 5.8中編寫代碼,並且必須避免寫出比它更新的任何東西。 :-(。3.特別是對於這個問題,它是我在網上某處遇到的一個Python程序,我想將它翻譯成Perl,但不幸的是,它在其上滑落。 –