Files
GKLB_INTM131/órai anyagok/extras/sections/07-enums-classes.tex
T
2026-09-08 09:36:02 +02:00

123 lines
4.0 KiB
TeX

\section{Enum/Osztályok}
\begin{frame}[fragile]{Enum alapok}
\footnotesize
Az \texttt{enum} (felsorolt típus) egy névvel ellátott, korlátozott értékkészletet definiál -- hasonló célt szolgál, mint a korábban látott string literal union, de saját névtérrel és futásidejű objektummal is jár.
\begin{lstlisting}[language=JavaScript,style=NodeJS]
enum Role {
Admin, // 0
Editor, // 1
Viewer, // 2
}
enum Status {
Pending = 'pending',
Active = 'active',
Closed = 'closed',
}
const myRole: Role = Role.Admin;
\end{lstlisting}
Numerikus enumnál automatikusan 0-tól számozódnak az értékek; string enumnál mi adjuk meg a konkrét szöveges értéket -- ez utóbbi jobban olvasható naplókban, hibaüzenetekben.
\end{frame}
\begin{frame}[fragile]{Osztályok TypeScript-ben}
\footnotesize
A TypeScript osztályai a JavaScript ES6 osztályaira épülnek, kiegészítve a mezők típusozásával.
\begin{lstlisting}[language=JavaScript,style=NodeJS]
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet(): string {
return `Szia, ${this.name} vagyok!`;
}
}
const p = new Person('Anna', 25);
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]{Access modifierek}
\footnotesize
Az osztály mezőihez és metódusaihoz \textbf{láthatósági szinteket} rendelhetünk -- ez segít elrejteni az implementációs részleteket, és csak a szándékolt "publikus felületet" mutatni kifelé.
\begin{lstlisting}[language=JavaScript,style=NodeJS]
class BankAccount {
private balance: number = 0;
public readonly owner: string;
constructor(owner: string) {
this.owner = owner;
}
public deposit(amount: number): void {
this.balance += amount;
}
}
\end{lstlisting}
\begin{itemize}
\item \textbf{\texttt{public}} (alapértelmezett): bárhonnan elérhető
\item \textbf{\texttt{private}}: csak az osztályon belülről érhető el
\item \textbf{\texttt{protected}}: az osztályon és leszármazottjain belül érhető el
\end{itemize}
\end{frame}
\begin{frame}[fragile]{Interfész implementálása osztállyal}
\footnotesize
Egy osztály az \texttt{implements} kulcsszóval kötelezettséget vállal arra, hogy megfelel egy adott interfésznek -- a fordító ellenőrzi, hogy tényleg minden szükséges mezőt/metódust megvalósít-e.
\begin{lstlisting}[language=JavaScript,style=NodeJS]
interface Greetable {
greet(): string;
}
class Person implements Greetable {
constructor(private name: string) {}
greet(): string {
return `Szia, ${this.name} vagyok!`;
}
}
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]{Decorators -- rövid kitekintés}
\footnotesize
A \textbf{decorator} egy speciális jelölés (\texttt{@valami}), amit osztályok, mezők vagy metódusok elé írhatunk, és ami futásidejű viselkedést csatol hozzájuk -- kicsit hasonlóan ahhoz, ahogy Express-ben a middleware-ek "csomagolják be" a route handlereket.
\begin{block}{Miért fontos ez most csak kitekintésként?}
A decorators ma még kísérleti funkció TypeScript-ben, de rendkívül elterjedt az ORM-ekben (pl. a későbbi heteken megismert TypeORM) -- ott \texttt{@Entity}, \texttt{@Column} jelölésekkel írjuk le az adatbázis-táblákat.
\end{block}
\begin{lstlisting}[language=JavaScript,style=NodeJS]
@Entity()
class User {
@Column()
name: string;
}
\end{lstlisting}
\end{frame}
\begin{frame}{Összefoglalás -- Enum és Osztályok}
\footnotesize
\begin{block}{Enum és Osztályok}
\begin{itemize}
\item \texttt{enum}: névvel ellátott, korlátozott értékkészlet (numerikus vagy string alapú)
\item Osztályok: mezők típusozása, konstruktor, metódusok -- az ES6 osztályokra épül
\item Access modifierek: \texttt{public} / \texttt{private} / \texttt{protected} -- a láthatóság szabályozása
\item \texttt{implements}: egy osztály kötelezettséget vállal egy interfész megvalósítására
\item Decorators: \texttt{@valami} jelölések, amik későbbi heteken (TypeORM) kerülnek elő
\end{itemize}
\end{block}
\end{frame}