[[oktatas:web:typescript|< TypeScript]] ====== TypeScript OOP ====== * **Szerző:** Sallai András * Copyright (c) 2021, Sallai András * Szerkesztve: 2021, 2022, 2024 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Osztály ===== class Dolgozo { nev: string; fiz: number; } let janos = new Dolgozo(); janos.nev = 'Nagy János'; janos.fiz = 2850000; console.log(janos.nev, janos.fiz); ===== Konstruktor ===== class Dolgozo { nev: string; fiz: number; constructor(nev: string, fiz: number) { this.nev = nev; this.fiz = fiz; } } let janos = new Dolgozo('Nagy János', 2850000); console.log(janos.nev, janos.fiz); Nem lehet több konstruktort megadni, de beállíthatók opcionális paraméterek, így készíthetünk több alakú konstruktort. A metódusokat sem írhatjuk le többször, de használhatjuk az opcionális paramétereket. ===== Öröklés ===== class Szemely { nev: string; constructor(nev: string) { this.nev = nev; } } class Dolgozo extends Szemely { fiz: number; constructor(nev: string, fiz: number) { super(nev); this.fiz = fiz; } } let janos = new Dolgozo('Nagy János', 2850000); console.log(janos.nev, janos.fiz); ===== Absztrakt osztály ===== Nem példányosítható, csak öröklésre használható. Az absztrakt osztályban előírhatók kötelezően megvalósítandó tulajdonságok és metódusok. abstract class Szemely { nev: string; constructor(nev: string) { this.nev = nev; } abstract emelFizetes(number); } class Dolgozo extends Szemely { fiz: number; constructor(nev: string, fiz: number) { super(nev); this.fiz = fiz; } emelFizetes(mertek: number) { this.fiz = this.fiz + mertek; } } let janos = new Dolgozo('Nagy János', 2850000); console.log(janos.nev, janos.fiz); janos.emelFizetes(100000); console.log(janos.nev, janos.fiz); ===== Tagok elérése ===== Elérés szabályozása: * public * private * protected * readonly A protected hasonlít a private-hoz, de kivétel, hogy a származtatott osztályokban elérhetők a tagok. Nézzünk egy példát a private adattagra: class Dolgozo { private nev: string; fiz: number; constructor(nev: string, fiz: number) { this.nev = nev; this.fiz = fiz; } kerNev(): string { return this.nev; } } let janos = new Dolgozo('Nagy János', 2850000); console.log(janos.kerNev(), janos.fiz); A nev mező, csak a kerNev() metóduson keresztül érhető el. A mező, ebben a formában nem kaphat új értéket. Vegyünk fel egy beállító metódust is: class Dolgozo { private nev: string; fiz: number; constructor(nev: string, fiz: number) { this.nev = nev; this.fiz = fiz; } kerNev(): string { return this.nev; } allitNev(nev: string): void { this.nev = nev; } } let janos = new Dolgozo('Nagy János', 2850000); console.log(janos.kerNev(), janos.fiz); janos.allitNev('Kaland Ferenc'); console.log(janos.kerNev(), janos.fiz); Most új értéket is beállíthatunk a nev mező számára. ===== Statikus tagok ===== Ha olyan osztályunk van, amiből csak egy dolgot reprezentálhat a valóságból, akkor érdemes statikus tagokat használni. A következő példában egy saját matematikai osztályt deklarálunk. Mivel matematikából csak egy van, a példányosításnak nincs sok értelme. Ezért a PI mező statikusra állítjuk be, így a mező értékére példányosítás nélkül hivatkozhatunk, csak az osztály nevén keresztül: class SajatMath { static PI: number = 3.1415926535; } console.log(SajatMath.PI); ===== Interfész ===== ==== Típusként ==== interface Szemely { name: string; city: string; } var dolgozo: Szemely; dolgozo.name = 'Pali'; dolgozo.city = 'Szeged'; interface Szemely { name: string; city: string; } var dolgozo = {}; dolgozo.name = 'Pali'; dolgozo.city = 'Szeged'; ==== Osztállyal ==== interface Szemely { name: string, city: string, greet(): string } class Dolgozo implements Szemely { name: 'János'; city: 'Szeged'; greet():string { return 'Üdv'; } } var mari: Dolgozo = new Dolgozo(); console.log(mari.greet()); ===== Kivételek ===== try { throw new Error('Hiba! valami elromlott'); }catch(e) { console.log(e); } var num: number = -1; try { if (num <0) throw new Error('Hiba! Negatív szám'); }catch(e) { console.log(e); } ===== A get és a set ===== ==== Hagyományosan ==== class Circle { private _radius: number; constructor(radius: number) { this._radius = radius; } getRadius(): number { return this._radius; } setRadius(value: number) { if (value >= 0) { this._radius = value; } else { console.log("Invalid radius value."); } } } const myCircle = new Circle(5); myCircle.setRadius(10); console.log(myCircle.getRadius()); // Kimenet: 10 myCircle.setRadius(-5); // Kimenet: Invalid radius value. console.log(myCircle.getRadius()); // Kimenet: 10 ==== A get és set használata ==== class Circle { private _radius: number; constructor(radius: number) { this._radius = radius; } get radius(): number { return this._radius; } set radius(value: number) { if (value >= 0) { this._radius = value; } else { console.log("Invalid radius value."); } } } const myCircle = new Circle(5); myCircle.radius = 10; console.log(myCircle.radius); myCircle.radius = -5; // Kimenet: Invalid radius value. console.log(myCircle.radius); Mi a különbség? Ugyanazt valósítják meg. Van aki szerint a get és a set használata átláthatóbbá és rugalmasabbá teszi a kódot.