Felhasználói eszközök

Eszközök a webhelyen


oktatas:programozas:objektum_orientalt_programozas

< Programozás

Objektum Orientált Programozás

  • Szerző: Sallai András
  • Copyright © Sallai András, 2011, 2014, 2015
  • Licenc: GNU Free Documentation License 1.3

Bevezetés

Itt csak egy rövid összefoglalót találunk az objektum orientált programozásról. A objektum orientált programok konkrét megvalósítását lásd az adott programozási nyelvnél.

Az angol Object-Oriented programming szavakból alkotott betűszó, röviden OOP. A valós világot próbálja modellezni. A műveletek megalkotása helyett objektum hierarchiákat hozunk létre.

Az egyes nyelvekhez tartozó Objektum Orientált megvalósításokat lásd a konkrét nyelveknél, itt csak rövid áttekintést találunk.

Osztály

Angolul class. Egy egyed leírása, amiről információkat tárolunk. Ez az információ a programozási nyelvben változókat, és a változókon elvégzett műveletekből (eljárás, metódus) áll.

Felépíthetjük például a Dolgozók osztályát. A dolgozónak tulajdonságai, amelyet egy változóban tárolhatunk, például a neve, kora, születésének ideje, fizetése, stb. A metódusok, beállíthatják, lekérdezhetik a nevet, a születést, vagy meghatározhatják az osztály egyéb viselkedését.

Azt is mondhatjuk az osztály az objektum terve.

Mező

A mező tulajdonképpen az osztály változói. Tulajdonságoknak, attribútumoknak vagy adattagoknak szokás még nevezni. A C# nyelv tartalmaz úgynevezett tulajdonság létrehozási lehetőséget, így ott a „tulajdonság” szónak más jelentése is van.

Metódus

A mezőkön végrehajtható eljárások és függvények összefoglaló neve. A osztály viselkedésének is mondjuk.

Osztály létrehozása

Osztályt általában a class kulcsszóval vezetjük be, utána pedig a nevét adjuk meg.

class Szemely {
	String nev;
	int kor;
}

A mezők és a metódusok alkotják az osztály tagjait.

Python megközelítésben

Konstruktor

A konstruktor egy speciális metódus. Speciális mivel megegyezik az osztály nevével. Nem lehet visszatérési értéke.

Konstruktor Java és C# nyelven:

class Szemely {
	public String nev;
	public int kor;
	public Szemely() {
		this.nev = "névtelen";
		this.kor = -1;
	}
}

A konstruktor mindig akkor fut le, amikor egy objektumot létrehozunk.

Konstruktor Python módra

Destruktor

Némely nyelvben van destruktor is. A destruktor akkor hajtódik végre, ha valamilyen objektumot megszüntetünk.

A Java nyelvben nem használunk destruktort.

A programozási nyelvekben általában a destruktor neve is megegyezik az osztály nevével, de egy ~ karaktert szokás elé tenni.

Objektum

Az osztály egy példányosított változata.

A fenti Dolgozó osztályból ha egy példányt hozunk létre, az már egy konkrét dolgozó lesz. Lehet például egy „Nagy József” nevű dolgozó, aki 28 éves, 480000 - Ft a fizetése. Az objektumnak is adnunk kell egy nevet. Például Joska.

Példa Java és C# nyelven:

Dolgozo janos = new Dolgozo();

Az objektumot az osztályból hozzuk létre. Olyan ez mint egy változó létrehozása. Az egyenlőség jel jobboldalán a new kulcsszó való az objektum példány létrehozására. A new után mindig a konstruktort hívjuk.

Elérés

Az osztály egyes tagjai (változók és metódusok) elérése változtatható.

  • A public elérés, azt jelenti, hogy az adott tag más osztályokból is elérhető.
  • A private elérés, azt jelenti, hogy más osztályokból nem érhető el a tag, még az örökölés lévén létrejött osztályokban sem.
  • A protected elérés, az jelenti, hogy csak az örökölés során létrehozott osztályokban érhető el.

Öröklés

Egy osztályból újabb osztályt hozhatunk létre, ennek folyamatát nevezzük öröklésnek. Az öröklés során az új osztály örökli az előző minden tagját, beleértve a mezőket és a metódusokat.

Öröklés Java nyelven:

class Szemely {
	String nev;
	int kor;
}
 
class Dolgozo extends Szemely {
	String munkakor;
}

Öröklés C# nyelven:

class Szemely {
		public String nev;
		public int kor;
}
 
class Dolgozo : Szemely {
		String munkakor;
}

Többalakúság

A metódusok és a konstruktorok több alakban is meghívhatók. Az osztályok öröklés révén több formában is példányosíthatók. Ezeket a lehetőségeket nevezzük többalakúságnak.

Többalakúság örökléssel

Program01.java
class Allat {
    public void eszik() {
        System.out.println("evés...");
    }
}
 
class Macska extends Allat {
    public void nyavog() {
        System.out.println("miau");
    }
}
 
public class Tobbalakusag_01 {
    public static void main(String[] args) {
        Macska macska = new Macska();        
        Allat allat;
 
        allat = macska;
 
        macska.eszik();
        macska.nyavog();
 
        allat.eszik();
        /* Az allat objektum a macska objektumra mutat,
           mégsem lehet futtatni az allat objektumon
           a nyavog() metódust. Mintha több alakja lenne.
        */
    }    
}

Többalakúság interfésszel

Program01.java
interface Allat {
    public void beszel();
}
 
class Macska implements Allat {
    public void beszel() {
        System.out.println("miau");
    }
}
 
class Kutya implements Allat {
    public void beszel() {
        System.out.println("vau");
    }
}
 
public class Program01 {
    public static void main(String[] args) {
        Allat a = new Macska();
        Allat b = new Kutya();
 
        a.beszel();
        b.beszel();
    }    
}

Függvény paraméter és öröklés

Program01.java
public class Program01 {
    public static void main(String[] args) {
        Macska macska = new Macska();
        Kutya kutya = new Kutya();
        Allat allat = new Allat();
        beszeltet(allat);
        beszeltet(macska);
        beszeltet(kutya);
    }
    public static void beszeltet(Allat allat) {
        allat.beszel();
        /* Az allat objektum másként viselkedik
        ha macska objektumot kap, és másként
        ha kutya objektumot kap */
    }
}
 
class Allat {
    public void beszel() {
        System.out.println("aaaaa");
    }
}
 
class Macska extends Allat {
    public void beszel() {
        System.out.println("miau");
    }
}
 
class Kutya extends Allat {
    public void beszel() {
        System.out.println("vau");
    }
}

Függvény paramétere és interfész

Program01.java
public class Program01 {
    public static void main(String[] args) {
        Macska macska = new Macska();
        Kutya kutya = new Kutya();
        beszeltet(macska);
        beszeltet(kutya);
    }
    public static void beszeltet(Allat allat) {
        allat.beszel();
        /* Az allat objektum másként viselkedik
        ha macska objektumot kap, és másként
        ha kutya objektumot kap */
    }
}
 
interface Allat {
    public void beszel();
}
 
class Macska implements Allat {
    public void beszel() {
        System.out.println("miau");
    }
}
 
class Kutya implements Allat {
    public void beszel() {
        System.out.println("vau");
    }
}

Virtuális metódus

Egy metódus akkor virtuális, ha az örökölt osztályokban felülírható. A programozási nyelvekben ezt az ősosztályban kell beállítani, általában a virtual kulcsszóval. A Java nyelvben nem szükséges ezt megtenni, mivel minden metódus alapértelmezettként felülírható, vagyis virtuális.

De pascal nyelven például:

point = Object(location)
  visible: boolean;
  Constructor Init(InitX, InitY: integer);
  Procedure Show; Virtual;
  Procedure Hide; Virtual;
  Function  IsVisible: boolean;
  Procedure MoveTo(NextX, NextY: integer);
End;

Vegyük észre a Virtual kulcsszót a Show és a Hide eljárásnál.

Kérdések

  1. Mivel dolgozunk objektum orientált programozásban?
  2. Mik az osztályok?
  3. Egy objektumorientált programozási nyelvben a viselkedés hogyan van leképezve?
  4. Mi a különbség az osztály és az objektum között?
  5. Mi a mező?
  6. Mi a metódus?
  7. Mi a konstruktor?
  8. Mi a destruktor?
  9. Mi az elérés? Milyen elérési szinteket ismer?
  10. Mondjon példát, az egyes programozási nyelvekben hogyan valósítják meg az öröklést?
  11. Mi a többalakúság?
  12. Mi a virtuális metódus?
  13. Hogyan teszünk Java nyelvben egy metódust virtuálissá?
  14. Milyen metódust hívunk meg példányosításnál?
  15. Milyen kulcsszót használunk példányosításnál?
  16. A példányosított objektum rendelkezik az osztályok valamelyik tulajdonságával?

Feladatok Java megoldásokkal

Feladat 001

Készítsen egy osztályt, amely járművek rendszámát és kivitelét tárolja. A járművek a következő kivitelűek lehetnek: buggi, cabrio, coupe, egyteru, ferdehatu, hot rod, kisbusz, kombi, lépcsős hátú, moped, pickup, sedan, sport, terepjáró. Írja meg azokat a metódusokat, amelyek lekérdezik, illetve beállítják a két mező értékét. A programban vegyen fel egy példajárművet, majd határozza meg a rendszámát, és a kivitelét, majd írassa a képernyőre a kivitelt.

Program01.java
class Jarmu {
	//Mezők
	private String rendszam;
	private JarmuKivitel kivitel;
	//Metódusok
	public String lekerRendszam() {
		return this.rendszam;
	}
	public void beallitRendszam(String atvettRendszam) {
		this.rendszam = atvettRendszam;
	}
	public JarmuKivitel lekerKivitel() {
		return this.kivitel;
	}
	public void beallitKivitel(JarmuKivitel atvettKivitel) {
		this.kivitel = atvettKivitel;
	}
}
 
enum JarmuKivitel {
	BUGGI,
	CABRIO,
	COUPE,
	EGYTERU,
	FERDEHATU,
	HOT_ROD,
	KISBUSZ,
	KOMBI,
	LEPCSOSHATU,
	MOPED,
	PICKUP,
	SEDAN,
	SPORT,
	TEREPJARO
}
 
public class Program01 {
	public static void main (String[] args) {
		Jarmu jarmu = new Jarmu();
		jarmu.beallitRendszam("ABC-123");
		jarmu.beallitKivitel(JarmuKivitel.MOPED);
 
		System.out.println("Példa jarmu: " + 
			jarmu.lekerKivitel() );
	}
}

Feladat 002

Ingatlanok adatait szeretnénk nyilvántartani. Ehhez kell egy osztályt elkészítenie.

Mit kell tárolni? Eladó vagy kiadó az ingatlan? Ár, alapterület, szobák száma, típus: tégla, panel, csúsztatott zsalus. Emeletek: mi felett? Szuterén, földszint, félemelet, 1,2 ..10, 10 felett Lift: van vagy nincs. Erkély: van vagy nincs. Állapot: beköltözhető, építés alatt, új építésű, újszerű, felújított, közepes állapotú, felújítandó, jó állapotú Fűtés: gáz (cirko), gáz (konvektor), gáz (héra), távfűtés, távfűtés egyedi méréssel, elektromos, házközponti, házközponti egyedi méréssel, fan-coil, geotermikus, cserépkályha, egyéb. Komfort: luxos, duplakomfortos, összkomfortos, komfortos, félkomfortos, komfort nélküli.

Lehetséges Java megoldás:

Program01.java
enum Status { ELADO, KIADO }
enum Tipus { TEGLA, PANEL, ZSALUS}
enum EmeletFelett { SZUTEREN, FOLDSZINT,
	FELEMELET, EGY, KETTO, HAROM, NEGY,
	OT, HAT, HET, NYOLC, KILENC, TIZ,
	TIZ_FELETT }
enum Allapot {
	BEKOLTOZHETO, EPITES_ALATT, UJ_EPITESU,
	UJSZERU, FELUJITOTT, KOZEPES, FELUJITANDO,
	JO }
enum Futes {
	GAZ_CIRKO, GAZ_KONVEKTOR, GAZ_HERA,
	TAVFUTES, TAVFUTES_EGYEDI, HAZKOZPONTI,
	HAZKOZPONTI_EGYEDI, FAN-COIL, GEOTERMIKUS,
	CSEREPKALYHA, EGYEB
}
enum Komfort {
	LUXUS, DUPLA, OSSZ, NORMAL, FEL, NINCS
}
class Ingatlan {
	Status status;
	double ar;
	int alapterulet;
	int szobakSzama;
	Tipus tipus;
	EmeletFelett emeletFelett;
	Allapot allapot;
	Futes futes;
	Komfort komfort;
}
 
public class Program01 {
 
	public static void main (String[] args) {
		System.out.println("Hi");
	}
}

Függelék

Hasonlat

Nagy József egy objektum
József születési adat tulajdonság
Jóska ehet, ihat, alhat, beszélhet stb. metódus
Jóska a programozók egy példánya osztály
Jóska egy másik objektumon alapszik,
amit programozóknak hívnak
prototípus
Jóska megtartja magának a jogot, hogy
kiszámítsa életkorát a születési adatok alapján.
egységbezárás
Nem szükséges ismerni, hogy számítjuk
ki Jóska életkorát.
információs rejtés
Jóska a fejlesztői csapat része, amelybe
beletartozik Mari grafikus és Kati nyelvész
Absztrakció
Jóska, Mari és Kati a személy objektumon
alapszik.
Öröklés
Mindenki beszél, de mindenki mást mond:
Jóska:beszél, Mari:beszél, Kati:beszél
többalakúság

Irodalom

Könyvek

  • Angster Erzsébet: Az objektumorientált tervezés és programozás alapjai
  • Angster Erzsébet: Objektumorientált Tervezés és Programozás - JAVA I. kötet
  • Angster Erzsébet: Objektumorientált Tervezés és Programozás JAVA II. Kötet

Linkek

oktatas/programozas/objektum_orientalt_programozas.txt · Utolsó módosítás: 2022/02/09 08:34 szerkesztette: admin