Я написал некоторый код 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";
Но если изменить вызывающему таким способом, он печатает что Должен быть. Так что довольно странно, почему объект $cat
был перезаписан после того, как был создан экземпляр $dog
?
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 всегда тяжелый; лучшее, что может сделать язык, не мешает вам. Но я думаю, что Муз облегчает восприятие правильности вашего дизайна. Возьмите пример выше.'talk' используется метод, но это действительно только атрибут. Таким образом, это должен быть метод в базовом классе, который использует еще один атрибут в дочерних классах. Мне тяжелее видеть такие вещи в старомодной форме. – innaM
@innaM Большое спасибо за вашу помощь. Позвольте мне кое-что объяснить. 1. Я действительно запутался, что мой экземпляр Dog переписал мой Cat, чтобы я хотел проверить данные в каждом классе. Я действительно не хочу определять get_name в каждом классе. 2. Раньше я работал с очень старыми машинами Unix, поэтому мне приходилось записывать код в Perl 5.8 и избегать писать что-либо более новое. :-(. 3. В частности, для этого вопроса, это была программа Python, которую я встретил где-то в Сети, и я бы хотел перевести ее на Perl. Но, к сожалению, на нее набросилось. –