2014. szeptember 23., kedd

A Java programozási nyelv - Láthatósági szintek

Az előző "A Java programozási nyelv - Osztályok, objektumok" című cikkben létrehoztunk osztályokat, amiből példányosítottunk objektumot és használtuk azt. A cikk végén írtam hoyg a péládk sok sebből véreznek és az alapvető OO elveket is megsértik.
Most ezeknek az elveknek a rendbetétele következik, azaz megnézzük hogy hogyan tudunk minden OO elvnek megfelelően osztályokat létrehozni Java-ban.

A következő osztálydefiníciót készítettük arra a célra hogy egy háromszög objektumot tárolni és kezelni tudjunk.

class Haromszog {
  int a;
  int b;
  int c;

  int kerulet(){
    return a+b+c;
  }
}

A példaprogramban pedig közvetlenül adtunk értéket a három tulajdonságnak.

Az OO elvek szerint ez megsérti az egységbezárás elvét, azaz azt, hogy az objektum tulajdonságai (azaz az objektum állapota) csakis magára az objektumra tartozik, azokat csakis ő kezelheti. ez azt jelenti hogy a tulajdonságok értékei közvetlenül nem módosíthatók (pl h1.a=3 nem támogatott).
Ahhoz hogy letilthassuk az adattagok elérését be kell tudnunk állítani azt, hogy az adott adattagnak milyen a láthatósága.
A Java négyféle hozzáférési kategóriát ismer:
Nyilvános (public) : mindenhonnan elérhető
Rejtett (private): nem látható kívülről, csak az adott osztályon belül lehet elérni.
Védett (protected): az adott osztály és annak leszármazottai érhetik el.
Csomagszintű : ha nem adunk meg hozzáférést akkor csomagszintű lesz, azaz az ugyanabban a könyvtárban lévő osztályok láthatják.

Ezek alapján boncolgassuk tovább a példánkat, a Haromszog osztályt. Egyből tegyük priváttá az adattagokat a private módosítóval. Igen ám, de akkor nem fogjuk tudni elérni ezeket az adattagokat. Ez így van rendjén, éppen ezt akartuk, de akkor hogyan adjunk értéket nekik? Természetesen valamilyen metódussal amit viszont nyilvánosnak fogunk megadni.
Gondoljunk egy picit bele a példába. Egy háromszöget amikor a valóságban mondjuk megszerkesztünk, akkor a létrehozáskor adjuk meg az oldalhosszait. Ezek nem fognak a későbbiekben változni (alapesetben). Ez azt jelenti hogy a létrehozáskor, azaz a konstruktor hívásakor már ismerni kell a háromszög oldalait. Nos csináljuk ezt meg!
Az OO elvek között megtalálható a többalakúság (polimorfizmus) is. Ez azt jelenti hogy az objektum az üzenetekre (metódusokra) másként reagálhat, ha pl más paraméterezéssel hívjuk meg. Ezt hívjuk felültöltésnek (overload). Ha pl felültöltjük az alapértelmezett konstruktort és csinálunk egy olyat ami három int típusú paramétert vár, akkor máris lehetőségünk van a konstruáláskor az oldalhosszak beállítására. Azaz az objektum kezdeti állapotát be tudjuk állítani. Íme a fenti elvek szerint z átírt osztálydefiníció:

public class Haromszog {
  private int a;
  private int b;
  private int c;

  //konstruktornál nem szabad megadni visszatérési típust

  public Haromszog(int o1, int o2, int o3){
    a=o1;
    b=o2;
    c=o3;
  }

  public int kerulet(){
    return a+b+c;
  }
}

Ezek után az osztályból történő példányosítás így történik:

Haromszog h1 = new Haromszog(3,4,5);

Ezzel létrejött a h1 háromszög, aminek az adattagjai rejtettek és egy polimorf felültöltött konstruktoron keresztül inicializáltuk. A kerulet() metódust is elláttuk a public módosítóval így megadtuk pontosan az elérhetőségét.

Tegyük fel hogy el kell végeznünk különféle műveleteket, amik változtatják az objektumunk oldalainak hosszát. Például készítsünk egy nagyit() nevű metódust, azaz definiáljuk azt a műveletet, amivel meg tudjuk növelni egy háromszög oldalainak hosszát azonos arányban. A nagyít() metódus az aktuális objektumpéldányon végezze el a műveletet, tehát nem fog létrehozni új objektumot. Paraméterül adjuk át a nagyítás mértékét, ami pozitív szám kell hogy legyen.

Egészítsük ki az osztálydefiníciót az alábbi metódussal:

public void nagyit(float zoom){
   a = a * zoom;
   b = b * zoom;
   c = c * zoom;
}

Ezek után a következő programrészlettel létrehozzuk a háromszöget, majd kiíratjuk a kerületet. Utána megnöveljük duplájára és újból kiíratjuk a kerületet:

Haromszog h1 = new Haromszog(3,4,5);
System.out.println("Kerület: " + h1.kerulet());
h1.zoom(2);
System.out.println("Nagyítás után a kerület: " + h1.kerulet();


A következő cikkben megnézzük hogy hogyan is áll össze egy Java projekt. Milyen fordítási egységek vannak, milyen fájlokat kell létrehozni és azt hogyan tudjuk lefordítani és futtatni.

Nincsenek megjegyzések:

Megjegyzés küldése