[[oktatas:programozás:perl|< Perl]]
====== Perl Objektum Orientáltan ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2015
* Licenc: GNU Free Documentation License 1.3
* Web: http://szit.hu
===== Osztály létrehozása =====
A Perl nyelven az osztálynak csomagok felelnek meg.
A csomagok a váltózókat és a hozzátartozó eljárásokat,
függvényeket tartalmaznak.
package Dolgozo;
Elkészítjük a konstruktort:
sub new {
my $class = shift;
my $self = {
_nev => shift,
_szuletes => shift,
_fizetes => shift,
};
bless $self, $class;
return $self;
}
A "new" metódust, osztálymetódusként fogjuk meghívni.
Az osztálymetódusok hívásakor mindig automatikusan
beillesztésre kerül egy plusz paraméter, ez az osztály
típusa. Elsőként ezt tesszük el egy változóba: my $class = shift;
Utána jöhetnek a dolgozó adatainak beállításai.
Általában a konstruktort hívjuk csak osztálymetódusként.
A Perl nyelvben az konstruktor neve bármi lehet. Lehet Create(), New(),
new(), a névre nincs megkötés.
Készítünk egy példányt:
$janos = new Dolgozo( "Nagy", "János", "1980-01-01", 850000);
Ezek után használjuk fel a tartalmát:
print $janos->{_nev}." ";
print $janos->{_szuletes}."\n";
print $janos->{_fizetes}."\n";
A teljes lista:
#!/usr/bin/env perl
package Dolgozo;
sub new {
my $class = shift;
my $self = {
_nev => shift,
_szuletes => shift,
_fizets => shift,
};
bless $self, $class;
return $self;
}
1;
#!/usr/bin/env perl
use Dolgozo;
$janos = new Dolgozo( "Nagy", "János", "1980-01-01", 850000);
print $janos->{_nev}." ";
print $janos->{_szuletes}."\n";
print $janos->{_fizetes}."\n";
===== Metódusok használata =====
Az objektumorientált programozás egyik elve, hogy csak
metódusokon keresztül érjük el az osztály tagjait.
A keresztnév lekérdezése például:
sub lekerNev {
my( $self) = @_;
return $self->{_nev};
}
A paraméterlistába itt is automatikusan beszúrásra kerül egy változó,
de ez az objektumra mutató hivatkozás lesz, és nem az osztály típusa.
A lekerNev() metódus első paraméterként megkapja az objektum mutatóját,
ezt vesszük át a "$self" változóban. Így tudunk hivatkozni az objektum
_nev tagjára.
Beállítása:
sub beallitNev {
my ( $self, $nev ) = @_;
$self->{_nev} = $nev if defined($nev);
}
A beallitNev() tagfüggvény esetén is elsőként átvesszük az objektum mutatóját
a $self változóba, majd jöhet a valódi paraméter a név a $nev változóba.
Teljes lista:
#!/usr/bin/env perl
package Dolgozo;
sub new {
my $class = shift;
my $self = {
_nev => shift,
_szuletes => shift,
_fizetes => shift,
};
bless $self, $class;
return $self;
}
sub lekerNev {
my( $self) = @_;
return $self->{_nev};
}
sub beallitNev {
my ( $self, $nev ) = @_;
$self->{_nev} = $nev if defined($nev);
}
1;
#!/usr/bin/perl
use Dolgozo;
$janos = new Dolgozo( "Nagy János", "1980-01-01", 850000);
$janos->beallitNev("Piros Lajos");
print $janos->lekerNev();
===== Öröklés =====
Az öröklés meghatározása:
our @ISA = qw(Dolgozo);
Teljes lista:
#!/usr/bin/env perl
package Dolgozo;
sub new {
my $class = shift;
my $self = {
_nev => shift,
_szuletes => shift,
_fizetes => shift,
};
bless $self, $class;
return $self;
}
sub lekerNev {
my( $self) = @_;
return $self->{_nev};
}
sub beallitNev {
my ( $self, $nev ) = @_;
$self->{_nev} = $nev if defined($nev);
}
1;
#!/usr/bin/env perl
package Mernok;
use Dolgozo;
our @ISA = qw(Dolgozo);
sub new {
my($class) = @_;
my $self = $class->SUPER::new(@_[1], @_[2], @_[3]);
$self->{_diploma} = undef;
bless $self, $class;
return $self;
}
sub beallitDiploma {
my ( $self, $diploma ) = @_;
$self->{_diploma} = $diploma if defined($diploma);
}
sub lekerDiploma {
my( $self) = @_;
return $self->{_diploma};
}
1;
#!/usr/bin/perl
use Dolgozo;
use Mernok;
$janos = new Dolgozo( "Nagy János", "1980-01-01", 850000);
$janos->beallitNev("Piros Lajos");
print $janos->lekerNev();
$mari = new Mernok( "Piros Mária", "1985-06-01", 870000);
$mari->beallitDiploma("ABE34224");
print $mari->lekerNev()."\n";
print "Diploma száma: ".$mari->lekerDiploma();
===== Destruktor =====
A program befejezésével, a Perl automatikusan eltakarítja a memóriából a
nem használt objektumokat. Ha valaki mégis extra tevékenységet
szeretne a destruktorban, akkor azt a DESTROY nevű speciális metódusban
teheti meg.
#!/usr/bin/env perl
package Dolgozo;
sub new {
my $class = shift;
my $self = {
_nev => shift,
_szuletes => shift,
_fizetes => shift,
};
bless $self, $class;
return $self;
}
sub DESTROY {
print " Dolgozo::DESTROY meghívása\n";
}
sub lekerNev {
my( $self) = @_;
return $self->{_nev};
}
sub beallitNev {
my ( $self, $nev ) = @_;
$self->{_nev} = $nev if defined($nev);
}
1;