ich zwei Klassen haben, ist eine der Basisklasse (Mitarbeiter) und der andere seine Unterklasse, die es (Extend) die Codes, von denen erbt sind unten dargestellt:Vererbung in 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;
==================
Jetzt habe ich ein Stück Code, der unter Verwendung die Extend-Klasse:
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";
Meine Frage betrifft die Variable $ private, die in der Elternklasse definiert ist. Nach meinem Konzept sollten Vererbungsattribute und Methoden der Elternklasse über das Unterklassenobjekt verfügbar sein. Zum Beispiel läuft die Funktion getattr gut. Aber warum kann ich nicht auf die private Variable $ zugreifen, indem ich das Extend-Objekt der Basisklasse verwende?
Was fehlt mir hier? Kann mir bitte jemand helfen?
Beachten Sie, dass Ihre Verwendung von 'Exporter' hier falsch ist. Exportieren und Vererbung sind zwei völlig getrennte Mechanismen, und wenn Sie objektorientierten Code schreiben, dann wollen Sie nicht 'Exporter'. Es ist auch wahrscheinlich besser, spezifische Accessor-Methoden für die öffentlichen Attribute zu schreiben, da Ihr 'getattr' direkten Zugriff auf alle Instanzvariablen erlaubt, unabhängig davon, ob sie öffentlich oder privat sein sollen. Es ist nur eine geringfügige Verbesserung beim Schreiben von '$ obj -> {'attr'}' im aufrufenden Code – Borodin