Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.

Hasonló előadás


Az előadások a következő témára: "1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz."— Előadás másolata:

1 1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz

2 2 Adatrejtés : Az osztály a kritikus mezőit elrejti a külső programrészek elől Az adatrejtés az egységbezárás alproblémája. Cél: Az objektum képes legyen adatokat tárolni, azokat a külvilág képes legyen lekérdezni és megváltoztatni, de csak ellenőrzött módon!

3 3 Védelmi szintek : PRIVATE: csak az adott osztályon belül érhető el PROTECTED: az adott osztály, és a belőle származtatott gyerekosztályok érhetik el PUBLIC: bárki elérheti Ha az osztály egy DLL-ben van definiálva, akkor még külön rendelkezni kell a DLL-en kivülről láthatóságról: INTERNAL: az adott programon (DLL) belül mindenki, kifelé (külső.exe, külső.dll) senki INTERNAL PROTECTED: az adott programon belül mindenki (public), kifelé is elérhető, ha származtatunk az adott osztályból.

4 4 Védelmi szintek : Az alapértelmezett védelmi szint = PRIVATE. A védelem gyakorlatilag hatáskört módosít. Metódus védelme: meghívható-e? Változó védelme: lekérdezhető és módosítható-e? Sajnos nincs arra mód, hogy egy változó lekérdezhetőségét és megváltoztathatóságát külön szabályozzuk pontosan azért, mert a védelem hatáskört jelent. Ha nincs hatáskör -> nincs hozzáférés. Ha van hatáskör -> módosítható is.

5 5 public static void Main() { TVerem v1=new TVerem(); v1.Init(); v1.Push(16.3); v1.Push(12.4); while (v1.vm>0) float x = v1.Pop(); } public static void Main() { TVerem v1=new TVerem(); v1.Init(); v1.Push(16.3); v1.Push(12.4); while (v1.vm>0) float x = v1.Pop(); } A PRIVATE teljesen elrejti, kiolvasása sem lehetséges! class TVerem { private int vm; private float tomb[100]; public void Init() { vm = 0; } public void Push(float x) { tomb[ vm ] = x; vm++; } public float Pop() { vm--; return tomb[ vm ]; }

6 6 public static void Main() { TVerem v1=new TVerem(); v1.Init(); v1.Push(16.3); v1.Push(12.4); while (v1.vm>0) float x = v1.Pop(); v1.vm = 123123123; } public static void Main() { TVerem v1=new TVerem(); v1.Init(); v1.Push(16.3); v1.Push(12.4); while (v1.vm>0) float x = v1.Pop(); v1.vm = 123123123; } A PUBLIC teljesen láthatóvá teszi, nemcsak a kiolvasás, hanem a (gonosz) módosítás is lehetséges! class TVerem { public int vm; private float tomb[100]; public void Init() { vm = 0; } public void Push(float x) { tomb[ vm ] = x; vm++; } public float Pop() { vm--; return tomb[ vm ]; }

7 7 class TVerem { private int vm; public void setVM(int ujErtek) { if (ujErtek>=0 && ujErtek<vm) vm = ujErtek; else throw new Exception(”Hibás érték!”); } public int getVM() { return vm; } while (v1.getVM()>0) x += v1.Pop(); v1.setVM( 123123123 ); while (v1.getVM()>0) x += v1.Pop(); v1.setVM( 123123123 );

8 8 while (v1.vm>0) x += v1.Pop(); v1.vm = 123123123 ; while (v1.vm>0) x += v1.Pop(); v1.vm = 123123123 ; Azt ‘hiszi’, van ‘vm’ nevű mező. Pedig nincs. Ezek valójában fv hívások !! class TVerem { private int _vm; public int vm { set { if (value>=0 && value <_vm) _vm = value; else throw new Exception(”Hibás érték!”); } get { return _vm; }

9 9 Property : Virtuális adatmező. Fizikailag nem létezik az adatmező, a memóriába nem foglalódik neki hely (takarékos). Van/lehet neki ‘get’ és ‘set’ része. A ‘set’ részben a beírandó új értéket a ‘value’ kulcsszóval lehet elérni. Nem kötelező mindkét részt kidolgozni: csak ‘get’ -> csak olvasható mező csak ‘set’ -> csak írható mező

10 10 Előnyök: ‘szebb’, elegánsabb kód a felhasználói oldalon (mint a fv hivás) Előnyök: könnyedén tudunk csinálni meglévő fizikai mezőből virtuálisat, a közben elkészült felhasználó kódban pedig nem kell változtatni.

11 11 Hátrányok: sebesség-megtévesztő: a felhasználó azt hiszi, ez egy gyors elérésű fizikai mező, holott lassú fv-hívás. E miatt nem jut eszébe a sokszoros ‘fv hívások kiküszöbölése’-re figyelni: while (v.vm>0) // fv hívás !!! { … } int db = v.vm; while (db>0) { … db --; }

12 12 class Teglalap { public int X1,X2; public int Y1,Y2; public int Szeles { get { return X2-X1; } set { X2 = X1+value; } Teglalap t = new Teglalap(); t.X1 = 10; t.Y1 = 12; t.Szeles = 30; Teglalap t = new Teglalap(); t.X1 = 10; t.Y1 = 12; t.Szeles = 30;


Letölteni ppt "1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz."

Hasonló előadás


Google Hirdetések