Objektumorientált programozás C# nyelven II.

Hasonló dokumentumok
Objektumorientált programozás C# nyelven

Objektumorientált programozás C# nyelven II.

Objektumorientált programozás C# nyelven

Objektumorientált programozás C# nyelven III.

Objektumorientált programozás C# nyelven III.

Öröklés és Polimorfizmus

OOP I. Egyszerő algoritmusok és leírásuk. Készítette: Dr. Kotsis Domokos

Programozás II. labor

Objektumorientált programozás C# nyelven

C++ programozási nyelv

Java programozási nyelv 5. rész Osztályok III.

Objektumorientált Programozás III.

OOP #14 (referencia-elv)

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Objektumorientált programozás C# nyelven

OOP: Java 8.Gy: Abstract osztályok, interfészek

58. Osztály, objektum fogalma, implementációs lehetőségek(shagreen) 59. Egységbezárás (elvi háttere, gyakorlati megvalósítás) (Shagreen)

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

JAVA PROGRAMOZÁS 2.ELŐADÁS

C# osztályok. Krizsán Zoltán

Programozási nyelvek Java

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

OOP. #6 (VMT és DMT) v :33:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Szoftvertervezés és -fejlesztés I.

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Programozási nyelvek Java

Objektumorientált Programozás IV.

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Programozási Paradigmák és Technikák

Objektumok inicializálása

Java programozási nyelv 4. rész Osztályok II.

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

C++ programozási nyelv Konstruktorok-destruktorok

Objektumorientált programozás C# nyelven

Programozás módszertan p.1/46

BME MOGI Gépészeti informatika 8.

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

C#, OOP. Osztályok tervezése C#-ban

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

Objektum Orientált Programozás IV.

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Java II. I A Java programozási nyelv alapelemei

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

III. OOP (objektumok, osztályok)

Objektumorientált Programozás VI.

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Programozás II gyakorlat. 6. Polimorfizmus

Objektumorientált programozás C# nyelven

Objektumorientált Programozás VI.

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Abstract osztályok és interface-ek. 7-dik gyakorlat

Interfészek. PPT 2007/2008 tavasz.

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Vizuális, eseményvezérelt programozás XI.

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Osztályok. 4. gyakorlat

Programozás I. Első ZH segédlet

Bánsághi Anna

Objektumorientált programozás IX. Osztályok, objektumok

Objektumorientált programozás C# nyelven

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

A C# programozási nyelv alapjai

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Már megismert fogalmak áttekintése

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Java és web programozás

Bánsághi Anna

Java és web programozás

Globális operátor overloading

Programozás II. labor

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

Alkalmazott modul: Programozás 11. előadás. Objektumorientált programozás: öröklődés

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Programozási nyelvek Java

Java és web programozás

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Programozás I. Gyakorlás egydimenziós tömbökkel Többdimenziós tömbök Gyakorló feladatok V 1.0 ÓE-NIK-AII,

Java II. I A Java programozási nyelv alapelemei

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

BME MOGI Gépészeti informatika 7.

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

JAVA PROGRAMOZÁS 3.ELŐADÁS

Web-technológia PHP-vel

Átírás:

Objektumorientált programozás C# nyelven II. Öröklés és többalakúság Nemvirtuális metódusok, elrejtés Virtuális metódusok, elrejtés Típuskényszerítés, az is és as operátorok Absztrakt osztályok, absztrakt metódusok Lezárt osztályok, lezárt metódusok Készítette: Miklós Árpád Dr. Kotsis Domokos

Hallgatói tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendı anyag vázlatát képezik. Ismeretük szükséges, de nem elégséges feltétele a sikeres zárthelyinek, illetve vizsgának. Sikeres zárthelyihez, illetve vizsgához a jelen bemutató tartalmán felül a kötelezı irodalomként megjelölt anyag, a gyakorlatokon szóban, illetve a táblán átadott tudnivalók ismerete, valamint a gyakorlatokon megoldott példák és az otthoni feldolgozás céljából kiadott feladatok önálló megoldásának képessége is szükséges. 2007.08.19. 2

Öröklés (1) Az osztályokból létrehozhatunk leszármazott osztályokat, amelyek öröklik az ısosztály összes tagját Az örökölt metódusok a leszármazottakban módosíthatók A leszármazottak új tagokkal (mezıkkel, metódusokkal) bıvíthetik az ısosztálytól örökölt tagok halmazát Minden leszármazott osztálynak csak egy ıse lehet Minden osztály közös ıse a System.Object osztály class Object public Object() public Type GetType() protected object MemberwiseClone() public static bool ReferenceEquals(object obja, object objb) public static bool Equals(object obja, object objb) public virtual bool Equals(object obj) public virtual int GetHashCode() public virtual string ToString() 2007.08.19. 3

Öröklés (2) A leszármazott osztályok deklarációjánál : karakterrel elválasztva meg kell adnunk az ısosztály nevét is Ez nem kötelezı abban az esetben, ha az ısosztály a System.Object class Állat int lábszám; public Állat() public void Fut() Állat class Emlıs: Állat public bool KicsinyétEteti() class Kutya: Emlıs public void FarkátCsóválja() public void Ugat() Emlıs Kutya 2007.08.19. 4

Öröklés (3) A konstruktorok nem öröklıdnek class A Ha az ısosztályban van paraméter nélküli konstruktor, az a leszármazott osztály konstruktorában automatikusan meghívódik Ez egyaránt igaz az automatikusan generált alapértelmezett konstruktorra és a saját, paraméter nélküli konstruktorra Ha az ısosztályban nincs paraméter nélküli konstruktor, az ısosztály konstruktorát meg kell hívni a leszármazott osztály konstruktorából class B: A public B(int x) Erre a célra a base kulcsszó áll rendelkezésre Itt automatikusan létrejön egy paraméter nélküli konstruktor class A public A() Kézzel megadott paraméter nélküli konstruktor class B: A public B(int x) class A public A(int x) Hibás program class B: A public B(int x) class A public A(int x) Hivatkozás az ıs konstruktorára class B: A public B(int x): base(x) 2007.08.19. 5

Nemvirtuális metódusok A nemvirtuális metódusok változatlanul örökölhetık vagy a leszármazottakban elrejthetık Statikus (fordítási idejő vagy korai ) kötés jellemzi ıket A saját osztályuknak megfelelı típusú változókon keresztül hívhatók Fordítási idıben dıl el, hogy az ıket (adott típusú változókon keresztül) felhasználó programkód melyik osztályhoz tartozó nemvirtuális metódust hívja Alapértelmezésben minden metódus nemvirtuális Nem igényelnek semmilyen külön szintaktikai megjelölést Elrejtés: a leszármazott osztályban azonos néven létrehozunk egy másik metódust A leszármazott osztályban célszerő az újonnan bevezetett metódust a new kulcsszóval megjelölni Bár ez nem kötelezı, ha nem tesszük meg, a C# fordító figyelmeztet rá Az ısosztály azonos nevő metódusa a leszármazottban is elérhetı a base kulcsszó segítségével 2007.08.19. 6

Nemvirtuális metódusok (példa) using System; class Állat public void Fut() Console.WriteLine("Az állat így fut."); class Kutya: Állat new public void Fut() Console.WriteLine("A kutya így fut."); class Macska: Állat new public void Fut() Console.WriteLine("A macska így fut."); 2007.08.19. 7

Nemvirtuális metódusok (példa) class NemvirtuálisMetódusok static void Main() Állat egyikállat = new Állat(); Kutya másikállat = new Kutya(); egyikállat.fut(); // Az Állat osztály Fut() metódusa hívódik meg másikállat.fut(); // A Kutya osztály Fut() metódusa hívódik meg Console.ReadLine(); Állat házikedvenc; házikedvenc = new Macska(); házikedvenc.fut(); // Az Állat osztály Fut() metódusa hívódik meg (!) házikedvenc = new Kutya(); házikedvenc.fut(); // és ismét az Állat osztály Fut() metódusa hívódik meg 2007.08.19. 8

Virtuális metódusok A virtuális metódusok a leszármazottakban módosíthatók ( felülbírálhatók ) vagy elrejthetık Dinamikus (futási idejő vagy más szóval késıi ) kötés jellemzi ıket Segítségükkel valódi többalakúság valósítható meg Saját vagy bármely ısosztályuknak megfelelı típusú változókon keresztül hívhatók Futási idıben, az adott változó típusától függıen dıl el, hogy az ıket felhasználó programkód melyik osztályhoz tartozó virtuális metódust hívja Hívási szabály: egy adott virtuális metódusból mindig a változó által ténylegesen hivatkozott osztályhoz legközelebb álló változatot hívja meg a program; a legtöbb esetben ez az osztály saját metódusváltozata Külön szintaktikai megjelölések tartoznak hozzájuk A virtuális metódusokat az ısosztályban a virtual kulcsszóval kell megjelölnünk A leszármazottakban felülbírált virtuális metódusokat az override kulcsszóval kell megjelölnünk Elrejtés: mint a nemvirtuális metódusok esetén Ha a leszármazottban azonos néven létrehozott új metódus szintén virtuális, akkor ezzel új virtuális hívási láncot hozhatunk létre 2007.08.19. 9

Virtuális metódusok (példa) using System; class Állat public virtual void Fut() Console.WriteLine("Az állat így fut."); class Kutya: Állat public override void Fut() Console.WriteLine("A kutya így fut."); class Macska: Állat public override void Fut() Console.WriteLine("A macska így fut.");... 2007.08.19. 10

Virtuális metódusok (példa)... class VirtuálisMetódusok static void Main() Állat házikedvenc; házikedvenc = new Macska(); házikedvenc.fut(); házikedvenc = new Kutya(); házikedvenc.fut(); 2007.08.19. 11

Virtuális hívási láncok (példa) using System; class Állat public virtual void MiVagyokÉn() Console.WriteLine("Állat"); class Kutya: Állat public override void MiVagyokÉn() Console.WriteLine("Kutya"); class Terelıkutya: Kutya public new virtual void MiVagyokÉn() Console.WriteLine("Terelıkutya"); class Puli: Terelıkutya public override void MiVagyokÉn() Console.WriteLine("Puli");... 2007.08.19. 12

... Virtuális hívási láncok (példa) class VirtuálisHívásiLáncok static void Main() Puli loncsoska = new Puli(); Terelıkutya t = loncsoska; Kutya k = loncsoska; Állat á = loncsoska; á.mivagyokén(); k.mivagyokén(); t.mivagyokén(); loncsoska.mivagyokén(); 2007.08.19. 13

Típuskényszerítés Típuskényszerítésnél ( casting ) egy adott típusú objektumot úgy kezelünk, mintha egy másik típusba tartozna Implicit típuskényszerítés: a típusok átalakítása automatikus Példa: egész számok átalakítása valós számmá Explicit típuskényszerítés: átalakítás a programozó kérésére Módja: az átalakítandó típus elé, ( ) karakterek közé kiírjuk a kívánt céltípust Késıbb részletesebben tárgyaljuk Állat Cirmos = new Macska(); Állat amıba = new Állat(); Macska Lukrécia; Kutya Bodri; Lukrécia = (Macska) Cirmos; Bodri = (Kutya) Lukrécia; Lukrécia = (Macska) amıba; Implicit típusátalakítás ( Állat helyén mindig szerepelhet Macska ) Explicit típusátalakítás a programozó kérésére (helyesen, mert errıl az Állat -ról biztosan tudjuk, hogy Macska ) Fordítási hiba: a Macska típus nem alakítható át a Kutya típusra Futási idejő hiba: Macska helyén nem szerepelhet Állat 2007.08.19. 14

Az is és as operátorok Az is operátor segítségével ellenırizhetı, hogy egy objektum egy adott osztályhoz vagy leszármazottjához tartozik-e Ez az ellenırzı kifejezés logikai típusú értéket ad vissza Az as operátor segítségével explicit típusátalakítást hajthatunk végre futási idejő hiba veszélye nélkül Ha az átalakítás nem sikerül, a kifejezés értéke null lesz class Állatfarm Állat Cirmos = new Macska(); Állat amıba = new Állat(); Macska Lukrécia; Kutya Bodri; Lukrécia = Cirmos as Macska; if (amıba is Kutya) Bodri = amıba as Kutya; Lukrécia = amıba as Macska; A típusátalakítás sikerülni fog (Cirmos értéke Macska típusú) A típusátalakításra nem kerül sor, mert amıba értéke nem Kutya típusú, így már a feltétel sem teljesül A típusátalakítás nem fog sikerülni ( Macska helyén nem szerepelhet Állat ) 2007.08.19. 15

Absztrakt osztályok és metódusok Az absztrakt metódusok nem tartalmaznak megvalósítást Egy osztály akkor absztrakt, ha tartalmaz legalább egy absztrakt metódust Az absztrakt osztályok nem példányosíthatók Absztrakt metódusaikat leszármazottaik kötelesek felülbírálni, azaz megvalósítást készíteni hozzájuk Az absztrakt metódusok mindig virtuálisak (ezt nem kell külön jelölnünk) Az absztrakt osztályok garantálják, hogy leszármazottaik tartalmazni fognak bizonyos funkciókat Az absztrakt metódusokat és osztályok az abstract kulcsszóval kell megjelölnünk 2007.08.19. 16

Absztrakt osztályok (példa) abstract class Alakzat public abstract void Kirajzol(); class Ellipszis: Alakzat public override void Kirajzol() // Kirajzol() metódus az Ellipszis osztály megvalósításában class Kör: Ellipszis public override void Kirajzol(); // Kirajzol() metódus a Kör osztály megvalósításában Ebbıl az osztályból példányt nem hozhatunk létre, leszármazottai viszont biztosan tartalmaznak egy megvalósított Kirajzol() nevő metódust 2007.08.19. 17

Lezárt osztályok és metódusok Lezárt osztályból nem származtatható másik osztály Lezárt metódus leszármazottakban nem bírálható felül Metódusok lezárásának csak felülbírált, eredetileg valamelyik ıs által definiált virtuális metódusoknál van értelme A lezárt osztályok és lezárt metódusok célja az öröklés megakadályozása Lehetséges indokai: Elıre nem látható célú felhasználás (és a vele járó karbantartási, illetve támogatási problémák) elkerülése Teljesítmény optimalizálása Csak osztályszintő tagokat tartalmazó osztályok Biztosra vehetı, hogy nem lesznek leszármazottak, így a virtuális metódusok nemvirtuálisra cserélhetık Szerzıi jogok védelme A lezárt osztályokat és metódusokat a sealed kulcsszóval kell megjelölnünk Erıs korlátozást jelentenek a fejlesztés során 2007.08.19. 18

Feladat Készítsen Vonatdef osztályt, melyben a beolvas metódusban megadható egy vonat neve, az állomások neve, az indulások ideje (max 100 db), és ezek az osztály adattételeiben tárolódnak. Az üres állomásnév jelentse a beolvasás végét. A kiír metódus kiírja azokat a képernyıre. Készítsen Vonatkez osztályt, melyben a fenti osztály két példányába beírja az adatokat, majd kiírja azokat a képernyıre. 2007.08.19. 19

Vonatdef osztály: adattételek class Vonatdef private string vonatnév; private string [,] állomások= new string[100,2]; private int hányállomás=0; 2007.08.19. 20

Vonatdef osztály: beolvas public void beolvas() string s; System.Console.WriteLine("add meg a vonat nevét! "); vonatnév=system.console.readline(); for(int i=0;i<100; i++) System.Console.WriteLine("add meg az"+(i+1)+"-ik állomás nevét! "); s=system.console.readline(); if (s=="") return; hányállomás++; állomások[i,0]=s; System.Console.WriteLine("add meg az"+(i+1)+ "-ik állomásról indulás idejét! (oo:pp) "); állomások[i,1]=system.console.readline(); return; 2007.08.19. 21

Vonatdef: kiír public void kiír() System.Console.WriteLine("Vonat neve: +vonatnév+"."); for(int i=0;i<hányállomás; i++) System.Console.Write("Állomás neve: "+ állomások[i,0]+","); System.Console.WriteLine("indulás ideje: "+ állomások[i,1]+"."); return; 2007.08.19. 22

Vonatkez osztály class Vonatkez static void Main() Vonatdef Arrabona=new Vonatdef(); Arrabona.beolvas(); Arrabona.kiír(); Vonatdef Helikon=new Vonatdef(); Helikon.beolvas(); Helikon.kiír(); 2007.08.19. 23

Feladat Készítsen a Vonatdef osztályban olyan metódust, mely a vonat nevét képes megváltoztatni. 2007.08.19. 24

A névváltoztató metódus I. public void névvált() System.Console.WriteLine ("Add meg az új vonatnevet! "); vonatnév=system.console.readline(); 2007.08.19. 25

Feladat Végezze el ugyanezt a beolvas metódus átdefiniálásával. 2007.08.19. 26

A névváltoztató metódus II. public void beolvas(string vonatnév) this.vonatnév=vonatnév; Ha azonos a paraméter és az adattétel neve Van paraméter Használat: Vonatdef Arrabona=new Vonatdef(); Arrabona.beolvas(); Arrabona.kiír(); System.Console.WriteLine("Add meg az új vonatnevet! "); Arrabona.beolvas(System.Console.ReadLine()); Arrabona.kiír(); 2007.08.19. 27

Másik névváltoztató metódus Van paraméter public void beolvas(int x) this.vonatnév=system.console.readline(); Használat: Vonatdef Arrabona=new Vonatdef(); Arrabona.beolvas(); Arrabona.kiír(); System.Console.WriteLine("Add meg az új vonatnevet! "); Arrabona.beolvas(123); Arrabona.kiír(); Mindegy, csak int legyen 2007.08.19. 28

Feladat Készítsen számológépet: a Számoló osztály tartalmazzon egy Kalk metódust, mely adott mőveleti kódra elvégzi két operandus között a megfelelı mőveletet. (A Kalk metódus az adatokat az osztály adattagjaiból vegye, ezeket a konstruktor állítsa be.) A Számol osztály készítsen ebbıl egy Kiszámol nevő példányt, kérjen be két operandust és egy mőveleti kódot, végeztesse el a mőveletet, majd írja ki az eredményt. 2007.08.19. 29

Számoló osztály: a Konstruktor class Számoló private float op1,op2; private char mővelet; private float eredmény; public Számoló(float op10, float op20, char mővelet0) op1 = op10; op2 = op20; mővelet = mővelet0; eredmény = 0; 2007.08.19. 30

Számoló osztály: a Kalk metódus public float Kalk() switch (mővelet) case '+': eredmény = op1 + op2; break; case '-': eredmény = op1 - op2; break; case '*': eredmény = op1 * op2; break; case '/': eredmény = op1 / op2; break; return eredmény; 2007.08.19. 31

A Számol osztály class Számol static void Main() float x,y; char z; string s; System.Console.Write("Elsı operandus: "); x=float.parse(system.console.readline()); System.Console.Write("Mőveleti jel: "); z=char.parse(system.console.readline()); System.Console.Write("Második operandus: "); y=float.parse(system.console.readline()); Számoló Kiszámol= new Számoló(x,y,z); System.Console.WriteLine(x+" "+z+" "+y+" = "+Kiszámol.Kalk()); System.Console.ReadLine(); 2007.08.19. 32

Egységbe zárás A private (alapértelmezés) vagy protected láthatóságú adattételek kívőlrıl nem érhetıek el. Próbáljuk közvetlenül kiírni az eredményt:.. System.Console.WriteLine(x+" "+z+" "+y+" = "+Kiszámol.eredmény);.. 2007.08.19. 33

Egyszerő öröklés Készítsük el a Számoló osztály örökösét, a Számolgató osztályt, mely pontos mása az ısnek. 2007.08.19. 34

A Számolgató osztály class Számolgató:Számoló public Számolgató(float op10, float op20, char mővelet0): base(op10,op20,mővelet0); A Számolgató és a Számoló ugyanazokkal az adattételekkel és metódusokkal rendelkezik, de a Számoló konstruktora paraméteres, így automatikusan nem hívódik meg. A base tétel használata után már ugyanúgy hívhatjuk:.. Számolgató Kiszámol= new Számolgató(x,y,z);.. 2007.08.19. 35

Többalakúság I. Bıvítsük a Számolgató osztály Kalk metódusát egy új mővelettel: a < mővelet eredménye legyen a két operandus közül a kisebb. 2007.08.19. 36

Az adattételek protected float op1,op2; protected char mővelet; protected float eredmény; A private (ez az alapértelmezés) adattételek az örökös nem örökölt metódusai számára sem láthatók! 2007.08.19. 37

A módosított Kalk metódus public new float Kalk() switch (mővelet) case '+': eredmény = op1 + op2; break; case '-': eredmény = op1 - op2; break; case '*': eredmény = op1 * op2; break; case '/': eredmény = op1 / op2; break; case '<': if (op2 < op1) eredmény = op2; else eredmény = op1; break; return eredmény; 2007.08.19. 38

Hívás class Számol static void Main() float x,y; char z; System.Console.Write("Elsı operandus: "); x=float.parse(system.console.readline()); System.Console.Write("Mőveleti jel: "); z=char.parse(system.console.readline()); System.Console.Write("Második operandus: "); y=float.parse(system.console.readline()); Számolgató Kiszámol= new Számolgató(x,y,z); System.Console.WriteLine(x+" "+z+" "+y+" = "+Kiszámol.Kalk()); System.Console.ReadLine(); 2007.08.19. 39

Többalakúság II.: korai kötés Bonyolítsuk a Számoló és a Számolgató osztályokat: ne a Kalk metódus legyen kívülrıl elérhetı, hanem a Kalkuláló metódus, mely meghívja a Kalk -ot. 2007.08.19. 40

Változások a Számoló osztályban. protected float Kalk() switch (mővelet).. return eredmény; public float Kalkuláló() return Kalk(); 2007.08.19. 41

Változások a Számolgató osztályban. protected new float Kalk() switch (mővelet).. return eredmény; 2007.08.19. 42

Kérdés A Kalk metódust újra definiáltuk, de a Kalkuláló metódust nem. A Számolgató osztályban a Kalkuláló melyik Kalk -ot hívja meg? Válasz Az eredetit. Ez a korai kötés. (Ha a < mőveletet adjuk meg, az eredmény 0 lesz.) 2007.08.19. 43

A késıi kötés Tegyük a Kalk metódust virtuálissá! 2007.08.19. 44

A Kalk metódus (Számoló) protected virtual float Kalk() switch (mővelet) case '+': eredmény = op1 + op2; break; case '-': eredmény = op1 - op2; break; case '*': eredmény = op1 * op2; break; case '/': eredmény = op1 / op2; break; return eredmény; 2007.08.19. 45

A Kalk metódus (Számolgató) protected override float Kalk() switch (mővelet) case '+': eredmény = op1 + op2; break; case '-': eredmény = op1 - op2; break; case '*': eredmény = op1 * op2; break; case '/': eredmény = op1 / op2; break; case '<': if (op2 < op1) eredmény = op2; else eredmény = op1; break; return eredmény; 2007.08.19. 46

Kérdés A Kalk metódust újra definiáltuk, de a Kalkuláló metódust nem. A Számolgató osztályban a Kalkuláló melyik Kalk -ot hívja meg? Válasz Az újat. Ez a késıi kötés. (Ha a < mőveletet adjuk meg, az eredmény jó lesz.) 2007.08.19. 47

Mentsük el ezt a programot, mert késıbb még szükség lesz rá! 2007.08.19. 48