Felhasználói eszközök

Eszközök a webhelyen


oktatas:web:typescript:typescript_oop

< TypeScript

TypeScript OOP

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 = <Szemely>{};
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

circle.ts
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

circle.ts
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.

oktatas/web/typescript/typescript_oop.txt · Utolsó módosítás: 2024/04/13 12:33 szerkesztette: admin