[[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;