You are on page 1of 42

Polimorzmus

Polimorzmus
Krizsn Zoltn1
ltalnos Informatikai Tanszk
Miskolci Egyetem

Objektumorientlt programozs C# alapokon tananyag

Krizsn Zoltn1

1/42

Polimorzmus

Tartalom

Polimorzmus
ltalnos informcik
Metdus felldenils
Jrm osztly virtulis metdussal
Grakus szerkeszt plda
Absztract metdus, absztrakt osztly

Krizsn Zoltn1

2/42

Polimorzmus

Kts fogalma

Kts (binding) fogalma: egy metdus hvshoz a megfelel


denci megtallsa.
Ehhez a metdusnv nem elg.
Ha az aktulis objektum osztlyban a nv egyedi (belertve
az rklt metdusokat is), a hatskr s a nv elegend az
azonostshoz.
Az objektum statikus tpusa alapjn az azonostst a
fordtprogram el tudja vgezni.
Ez korai kts (early binding).
Nem polimorzmus, mert a nv egyedi.

Krizsn Zoltn1

3/42

Polimorzmus

A poliformizmus implementcii

Metdusnv tlterhels

A mr ismert mechanizmus: egy osztlyon bell azonos nev


fggvnyek, eltr paramter szignatrval.
A sajt s az rklt fggvnyek egyttesen tekintendk.
Korai kts: a fordtprogram az aktulis paramterek
statikus tpusa alapjn dnteni tud.
Polimorzmus, mert a nv nem egyedi, tovbbi informcikat
kell felhasznlni.

Krizsn Zoltn1

4/42

Polimorzmus

A poliformizmus implementcii (folyt.)


Metdus felldenils
Az elznl mg hatkonyabb implementcis forma.
A leszrmazott osztly az s osztlytl rklt metdust
felldenilhatja.
Explicit krni kell a virtual/override kulcsszavakkal.
Egy ilyen metdus hvsnl dnteni kell, hogy az rklt vagy
a sajt vltozat hvdjon meg - polimorzmus.
A dnts alapja a hivatkozs dinamikus tpusa.
Mivel a dinamikus tpus fordtsi idben nem ismert, a
felldenilt metdusok kztti vlasztst futsidre kell
halasztani - ksi kts.
Krizsn Zoltn1

5/42

Polimorzmus

Tartalom

Polimorzmus
ltalnos informcik
Metdus felldenils
Jrm osztly virtulis metdussal
Grakus szerkeszt plda
Absztract metdus, absztrakt osztly

Krizsn Zoltn1

6/42

Polimorzmus

Metdus felldenils - alapszablyok

Egy s osztlybeli metdus felldenilshoz a kvetkez


feltteleknek kell teljeslnie:
A felldenil metdus visszatrsi tpusnak, nevnek, s
paramter szignatrjnak meg kell egyeznie az s
osztlybeli metdusval.
A felldenil metdus hozzfrsi kategrija csak ugyanaz
lehet (bvebb sem), mint az eredeti metdus. (Bvebb lehet.)
rdemes az override kulcsszval kezdeni Visual Studiban,
mert felajnl egy listt, s berja pontosan amit kell.

Krizsn Zoltn1

7/42

Polimorzmus

Override minst

rklt elemekhez j implementci


metdus,
tulajdonsg (property),
indexer,
esemny (event)

amit felldenil az valamelyik sben :virtual, abstract, or


override.

Krizsn Zoltn1

8/42

Polimorzmus

Felldenilt metdus hvsa

A hvsban szerepl valamennyi informci illik minden


metdus vltozatra - ez alapjn nem lehet dnteni.
A dnts alapja a hivatkozs dinamikus tpusa.
A dnts csak futs idben trtnhet.
A felldenil metdus az s osztly metdust elrheti a
base.metdusnv(...) formj hivatkozssal.

Krizsn Zoltn1

9/42

Polimorzmus

Virtulis metdus

Krizsn Zoltn1

10/42

Polimorzmus

A ksi kts hasznlata

Az leszrmaztats lehetsget teremt, hogy viselkedsformkat


rkljn egy osztly.
Bizonyos esetekben a vltozatlanul rkld viselkeds nem
felel meg a leszrmazottnak.
A felldenils lehetsge ezt a problmt tudja megoldani.
A ksi kts automatizmusa a hasznlatot knyelmess teszi.

Krizsn Zoltn1

11/42

Polimorzmus

Nem ktelez a leszrmazs minden szintjn felldenilni a


metdust.
Egy osztly rklheti a felldenilt metdust.

Statikus metdus nem denilhat fell. (rtelmetlen lenne,


mert hvsa a statikus tpus alapjn trtnik.)

Ugyanolyan nev statikus metdus a leszrmazott osztlyban


elfedi az s osztly metdust.

Krizsn Zoltn1

12/42

Polimorzmus

Pecstelt (sealed) metdus

Egy metdus kaphat sealed minstt.


A sealed minsts metdust nem denilhatja fell egyetlen
leszrmazott osztly sem.
Szerepe, hogy megakadlyozza bizonyos viselkeds formk
megvltoztatst, ha az veszlyezteti a helyes mkdst.

Krizsn Zoltn1

13/42

Polimorzmus

Metdus kitakars/rejts

Ha nincs virtual kulcssz,


s a leszrmazottban ugyanaz a metdus.

Krizsn Zoltn1

14/42

Polimorzmus

Kitakars plda

1
2
3
4
5
6
7

class A{
}

public void Foo () { Console . WriteLine ("A :: Foo () " ); }

class B : A{
public void Foo () { Console . WriteLine ("B :: Foo () " ); }
}

Krizsn Zoltn1

15/42

Polimorzmus

Kitakars plda

1
2
3
4
5
6
7
8
9
10
11
12
13
14

class Test {
static void Main ( string [] args ){
A a;
B b;
a = new A () ;
b = new B () ;
a. Foo () ; // output --> "A :: Foo () "
b. Foo () ; // output --> "B :: Foo () "

Krizsn Zoltn1

a = new B () ;
a. Foo () ; // output --> "A :: Foo () "

16/42

Polimorzmus

Kitakars <-> felldenils

Kitakars nagyon gyors, mert fordtsi idben dl el.


Felldenilskor egy objektumban tbb azonos metdus van.
Virtulis fv tblk jnnek ltre, amelyekbl futsi idben egy
mechanizmus vlaszt.
Felldenils knyelmes, mert nem kell trdnnk, a
megfelel hvdik meg.

Krizsn Zoltn1

17/42

Polimorzmus

Tartalom

Polimorzmus
ltalnos informcik
Metdus felldenils
Jrm osztly virtulis metdussal
Grakus szerkeszt plda
Absztract metdus, absztrakt osztly

Krizsn Zoltn1

18/42

Polimorzmus

Mdostott Jrm osztly


1 public class Jarmu {
2
private int _kerekek ;
3
private double _suly ;
4
public Jarmu ( int k , double s)
5
{ _kerekek = k ; _suly = s ;}
6
public int Kerekszam () {
7
return _kerekek ;}
8
public virtual double Kerekterheles ()
9
{ return _suly / _kerekek ; }
10
public double Sulya () { return
_suly ;}
11 }

Krizsn Zoltn1

19/42

Polimorzmus

Magyarzat

A Kerekszam metdus virtulis lett, virtual kulcssz.


8-as kdsor
Ezek utn a leszrmazottban felldenilhat.
Alapbl nem volt virtulis.

Krizsn Zoltn1

20/42

Polimorzmus

Gpkocsi osztly felldenil metdussal


1 public class Gepkocsi : Jarmu {
2
private int _szemelyek ;
3
public Gepkocsi ( int kerek , double suly ,
int szemSzam ) : base ( kerek , suly ){
4
_szemelyek = szemSzam ;
5
}
6
7
public override double Kerekterheles () {
8
return ( Sulya () + _szemelyek * 80) /
9
Kerekszam () ;
10
}
11 }

Krizsn Zoltn1

21/42

Polimorzmus

Magyarzat

Az itteni Kerekszam metdus felldenilja az rkltet,


override kulcssz.
7-es kdsor
Ezek utn mg a tovbbi leszrmazottban felldenilhat.
Tovbbra is virtulis.

Krizsn Zoltn1

22/42

Polimorzmus

Hasznlat

1
2
3
4
5
6
7
8
9
10
11
12
13

Jarmu bicikli = new Jarmu (2 , 15.0) ;


Console . Write (" Bicikli kerekeinek szama :");
Console . WriteLine ( bicikli . Kerekszam () );
Console . Write (" Bicikli kerekterhelese : ");
Console . WriteLine ( bicikli . Kerekterheles () );
Jarmu trabant = new Gepkocsi (4 , 600.0 , 4) ;
Console . Write (" Trabant kerekeinek szama : ") ;
Console . WriteLine ( trabant . Kerekszam () );
Jarmu ifa = new Teherauto (6 , 1200 , 2, 2500) ;
Console . Write (" Teherauto Max . kerekterheles : ");
Console . WriteLine ( ifa . Kerekterheles () );

Krizsn Zoltn1

23/42

Polimorzmus

Magyarzat

Mindhrom referencia bicikli, trabant, ifa jrm tpus.


1,7, 11 kdsorok.
A bicikli referencia statikus s dinamikus tpusa azonos.
A Gepkocsi osztlyban denilt Kerekterheles metdus hvdik
meg, a dinamikus tpusnak megfelelen. Itt a statikus tpus s
a dinamikus tpus ms.
Tovbbra is virtulis.

Krizsn Zoltn1

24/42

Polimorzmus

Tartalom

Polimorzmus
ltalnos informcik
Metdus felldenils
Jrm osztly virtulis metdussal
Grakus szerkeszt plda
Absztract metdus, absztrakt osztly

Krizsn Zoltn1

25/42

Polimorzmus

Megvalstand egy grakus editor.


Egyszerstsek:
skbeli alakzatok,
nincsenek sznek.

A rajzfelleten megjelen egysgek objektumok, mert


vannak adatszer tulajdonsgai (hely, mretek stb.)
vannak olyan mveletek, amelyek elvgezhetk rajtuk
(transzformcik stb.).

Az objektum orientlt szemllet hasznos.

Krizsn Zoltn1

26/42

Polimorzmus

Tervezsi dntsek

Minden objektum helyzett egy referencia pontja, s ha


szksges, egyb adatok (pldul szg) hatrozza meg.
Az egyes skidomok kzs tulajdonsgait meggyelve egy
rkldsi hierarchia pthet fel.

A kzs tulajdonsgokat s viselkeds mintkat csak egyszer


kell implementlni, a leszrmazottak kszen kapjk.

Krizsn Zoltn1

27/42

Polimorzmus

tervezsi dntsek (folyt.)

Minden objektumon elvgezhetk legyenek az alapvet


geometriai transzformcik.
Pldul eltols, forgats, tmretezs stb.

A transzformcik vgrehajtsrt maguk az objektumok


legyenek felelsek.
A megfelel metdusok fogjk vgrehajtani.
A transzformcis metdusok is rkldhetnek => kd
jrafelhasznls.

Ezen dntsek alapjn az osztlyterv egy els vltozata:

Krizsn Zoltn1

28/42

Polimorzmus

Osztlyterv

Nem teljes
Els vltozat

Finomtsra
fellvizsglatra

szorul.

Krizsn Zoltn1

29/42

Polimorzmus

Kd elemzse

Nzzk meg a MoveTo implementciit.


Point osztlyban:
1 void MoveTo ( int
2
Hide () ;
//
3
X = NewX ; //
4
Y = NewY ;
5
Show () ;
//
6 }

Krizsn Zoltn1

NewX , int NewY ) {


aktualis torlese
uj pozicio
megjelenites az uj helyen

30/42

Polimorzmus

Kd elemzse
Circle osztlyban:
1 void MoveTo ( int
2
Hide () ;
//
3
X = NewX ; //
4
Y = NewY ;
5
Show () ;
//
6 }

NewX , int NewY ) {


aktualis torlese
uj pozicio
megjelenites az uj helyen

A kt implementci azonosnak tnik, mert azonos az


algoritmus:
trls az aktulis pozciban,
referencia pont mdostsa,
megjelents.

Krizsn Zoltn1

31/42

Polimorzmus

Mi trtnik / hvdik?

A klnbsg:
a Point osztly MoveTo metdusban a Point Hide()-ja
hvdik meg
a Circle osztly MoveTo metdusban a Circle Hide()-ja
hvdik meg
Az algoritmus brmilyen alakzatra ugyanaz.
Krds: rklhet-e a MoveTo , vagy kln implementci
szksges minden osztlyra?

Krizsn Zoltn1

32/42

Polimorzmus

Magyarzat

A vlasz: rklhet! A magyarzat:


A MoveTo metdus a this.Show s this.Hide metdusokat
hvja meg.
A Show s Hide metdust minden osztly felldenilja
(hiszen mkdsk az alakzattl fgg).
A this pszeudvltoz dinamikus tpusa (amellyel a MoveTo-t
hasznltuk) dnt a felldenilt. Show s Hide metdusok
kztt.

Krizsn Zoltn1

33/42

Polimorzmus

MoveTo metdus hvsa a Circle osztly pldnybl

Krizsn Zoltn1

34/42

Polimorzmus

Tovbbi implementcis rszletek


Ltrehozott rajzelemek trolsa:
1
2
3
4
5
6
7
8
9
10
11

const int MAXELEM =1000;


int aktElemszam = 0;
Location elemek [];
elemek = new Location [ MAXELEM ];...
// Uj rajzelem letrehozasa
aktElemszam ++;
elemek [ aktElemszam ] = new ValamelyikOsztaly
for ( int i =0; i < aktElemszam ; i ++)
elemek [i ]. Show () ;

Deniljuk a Moveto metdust a Point osztlyban, amit


megkap a Circle.
Krizsn Zoltn1

35/42

Polimorzmus

Tartalom

Polimorzmus
ltalnos informcik
Metdus felldenils
Jrm osztly virtulis metdussal
Grakus szerkeszt plda
Absztract metdus, absztrakt osztly

Krizsn Zoltn1

36/42

Polimorzmus

Absztrakt metdus s osztly

Gyakran elfordul a tervezs sorn, hogy egy osztly szintjn


tudjuk, hogy valamilyen metdus szksges lesz a
leszrmazottakban, de mg nem lehet megadni az
implementcijt.
Ezrt a C# nyelv megengedi trzs nlkli metdus denilst.
Az ilyen metdust az abstract minstvel kell elltni.
Ha az osztly tartalmaz absztrakt metdust, az osztlyt is az
abstract minstvel kell elltni.

Krizsn Zoltn1

37/42

Polimorzmus

Absztrakt metdus s osztly (folyt.)

1 public abstract class Sikidom {


2
public abstract double terulet () ;
3
public abstract double kerulet () ;
4 }
A fenti osztlydenci az albbi tervezsi meggondolsokat fejezi
ki:
minden skidomnak van terlete s kerlete,
nincs algoritmus a terlet s kerlet szmtsra a skidom
tulajdonsgainak ismerete nlkl.

Krizsn Zoltn1

38/42

Polimorzmus

Absztrakt metdus s osztly - formai szablyok

Absztrakt egy metdus, ha nincs trzse. Megvalstst


(trzset), majd csak a felldenils sorn kap.
Absztrakt metdusnak nem lehet mdostja a private, nal,
static hiszen az ilyen metdusokat nem lehetne felldenilni.
Absztrakt egy osztly, ha van legalbb egy absztrakt metdusa.

Krizsn Zoltn1

39/42

Polimorzmus

Absztrakt metdus s osztly - formai szablyok II

Absztrakt osztlyt nem lehet pldnyostani.


Egy absztrakt osztly arra szolgl, hogy s osztlya legyen
tovbbi osztlyoknak.
A leszrmazott osztly(ok) feladata az absztrakt metdusok
felldenilsa.
Absztrakt osztly gyermeke lehet absztrakt, ha nem minden
absztrakt metdust valst meg.
Az absztrakt osztly is hasznlhat referencia statikus
tpusaknt.

Krizsn Zoltn1

40/42

Polimorzmus

Absztrakt metdus szerepe

Rgzt egy tervezsi dntst (szksges metdusok halmaza).


Knyszerti a leszrmazott osztly(ok) programozjt
meghatrozott metdusok denilsra.

Krizsn Zoltn1

41/42

Polimorzmus

Hibalehetsgek

Trzs nlkli metdus, abstract minst nlkl.


Implementlt metdus, abstract minstvel.
Absztrakt metdust tartalmaz osztly abstract minst
nlkl.
A fordtprogram gyeli az ilyen hibkat.

Krizsn Zoltn1

42/42

You might also like