{
type CoffeeCup = {
shots: number;
hasMilk: boolean;
};
interface CoffeeMakerA {
makeCoffee(shots: number): CoffeeCup;
}
*// Parent Class*
class CoffeeMaker {
private static BEANS_GRANS_PER_SHOT = 7;
private coffeeBeans: number = 0;
private constructor(coffeeBeans: number) {
this.coffeeBeans = coffeeBeans;
}
static makeMachine(coffeeBeans: number) {
return new CoffeeMaker(coffeeBeans);
}
private grindBeans(shots: number) {
console.log(`grinding beans for ${shots}`);
if (this.coffeeBeans < shots * CoffeeMaker.BEANS_GRANS_PER_SHOT) {
throw new Error('Not enough coffee beans!');
}
this.coffeeBeans -= shots * CoffeeMaker.BEANS_GRANS_PER_SHOT;
}
private preheat(): void {
console.log('heating up...π₯');
}
private extract(shots: number): CoffeeCup {
console.log(`Pulling ${shots} shots...β`);
return {
shots: shots,
hasMilk: false,
}
}
public makeCoffee(shots: number): CoffeeCup {
this.grindBeans(shots);
this.preheat();
return this.extract(shots);
}
public clean() {
console.log("Coffee Cleaning~...β¨");
}
}
*// Child Class*
class CaffeLatteMachine extends CoffeeMaker {
constructor(coffeeBeans: number, public serialNumber: string) {
super(coffeeBeans);
}
private steamMilk(): void {
console.log('Steaming some milk... π₯');
}
public makeCoffee(shots: number): CoffeeCup { *// μ€λ²λΌμ΄λ© λμ΄ νΈμΆλλ€.*
const coffee = super.makeCoffee(shots);
this.steamMilk();
console.log(coffee);
return {
...coffee, *// coffee λ super.makeCoffee(shots) μμ λ°νλ κ°μ²΄ μ΄μ§λ§ ...coffee λ κ°μ²΄ μμ μμλ€μ μλ―Ένλ€.*
hasMilk: true, *// object μ keyμ μ΄λ¦μ΄ κ°μ κ²½μ°, 맨 λ€μμ€λ κ°μ μ΄λ¦μ΄ μμ κ°μ μ΄λ¦μ keyμ κ°μ λ₯μ΄ μμ΄λ€.*
}
}
*// μμμ ν΅ν΄ λ©μλ μ¬μ¬μ©(μ€λ²λΌμ΄λ©)νμ¬ μ»€νΌλ¨Έμ μ μ°μ λ₯Ό μΆκ°νλ μλ‘μ΄ κΈ°λ₯μ κΈ°λ₯μ μΆκ°νμλ€.*
}
const latteMachine = new CaffeLatteMachine(33, 'ssss');
const coffee = latteMachine.makeCoffee(2);
console.log(coffee);
}
[ μμ - inheritance ]
μμμ λΆλͺ¨ μμ±μμ κΈ°λ₯μ λ¬Όλ €λ°μΌλ©΄μ μλ‘μ΄ κΈ°λ₯λ μΆκ°νλ κ²μ κ²μ μλ―Έν©λλ€.
μΈκ΅μμλ μμ λμ νμ(extend)μ΄λΌλ λ§μ μ°κ³ λ ν©λλ€.
super
μμ μμ±μ μ¬μ© μ κΌ super()λ₯Ό μμ±ν΄ μ£Όμ΄μΌ νλ€.
μμ μμ±μ λ―Έμ¬μ© μ super()λ₯Ό μμ±ν νμλ μλ€.
super ν€μλλ λΆλͺ¨ μ€λΈμ νΈμ ν¨μλ₯Ό νΈμΆν λ μ¬μ©λ©λλ€. (λΆλͺ¨ λ©€λ²λ³μλ thisλ‘ - μμ)
μμ±μμμλ super() ν€μλ νλλ§ μ¬μ©λκ±°λ this ν€μλκ° μ¬μ©λκΈ° μ μ νΈμΆλμ΄μΌ ν©λλ€. λν super ν€μλλ λΆλͺ¨ κ°μ²΄μ ν¨μλ₯Ό νΈμΆνλλ° μ¬μ©λ μ μμ΅λλ€.
β οΈ λΆλͺ¨ ν΄λμ€ λ©€λ²λ³μ μ κ·Ό
μμμ νκ² λλ©΄ κΈ°λ³Έμ μΌλ‘λ λΆλͺ¨ ν΄λμ€μμ κ°μ§κ³ μλ λͺ¨λ λ©€λ² λ³μ(μμ±), ν¨μ(νλ) λ€μ λν΄μΒ μμ ν΄λμ€κ° λͺ¨λ λ€ κ°μ§κ² λ©λλ€.
κ·Έλμ μμ ν΄λμ€μμ this ν€μλλ‘ λ©€λ² λ³μμ ν¨μλ€μ μ κ·Όν μ μκ² λμ£ .
νμ§λ§Β μμ±μμ ν¨μμΒ νν΄μλ§Β μμ ν΄λμ€κ° μμμ νλ©΄μ λ³κ²½μ ν μ μκ² λκ³ (μ΄κ±ΈΒ μ€λ²λΌμ΄λ©Β μ΄λΌκ³ νμ£ ?) μ΄λ μμμμ μ¬μ μλ ν¨μλ₯Ό νΈμΆνκ³ μΆλ€λ©΄ thisλ₯Ό,Β λΆλͺ¨ν΄λμ€μμ μλ μμ±λ ν¨μ (λλ μμ±μ)λ₯Ό νΈμΆνκ³ μΆλ€λ©΄ superλ₯ΌΒ μ¨μΌ ν΄μ π
μμ±μ(constructor)
μμ±μλ ν΄λμ€ κ°μ²΄λ₯Ό νΈμΆνλ©΄ μμ±μλ₯Ό νΈμΆνκ² λλ€.
λΆλͺ¨ ν΄λμ€κ° μμλ μμ ν΄λμ€ κ°μ²΄ νΈμΆ μ μμ±μλ μ€ν μμλ λΆλͺ¨ μμ±μκ° λ¨Όμ νΈμΆλκ³ κ·Έ λ€μμ μμ μμ±μκ° νΈμΆλλ€.
λΆλͺ¨, μμ μμ±μ λ λ€ μμ±(μ μΈ) μ
λΆλͺ¨ μμ±μμ μ λ¬λλ μΈμκ°μ΄ μμΌλ©΄ μμ μμ±μμμ λΆλͺ¨ μΈμκ°μ μ λ¬μμ¬ super(μΈμ)λ‘ μ λ¬ν΄ μ£Όμ΄μΌ νλ€. μμΌλ©΄ super() λ§ μ¬μ©νλ©΄ λλ€.
λ§μ½ λΆλͺ¨ μμ±μ(κΈ°λ³Έ μμ±μ)λ μ‘΄μ¬νμ§λ§ μμ μμ±μλ μμ μ λΆλͺ¨ μμ±μλ§ νΈμΆλλ€.
λ°λλ‘ μμ μμ±μλ§ μ‘΄μ¬νκ³ λΆλͺ¨ μμ±μκ° μ‘΄μ¬νμ§ μμλ μμ μμ±μμ super()μ νΈμΆν΄ μ£Όμ΄μΌ νλ€.
static λ©μλμμλ superλ₯Ό νΈμΆν μ μμ΅λλ€.
class Human {
constructor() {}
static ping() { *// static λ©μλ*
return 'ping';
}
}
class Computer extends Human {
constructor() { super() }
static pingpong() { *// static λ©μλ*
return super.ping() + ' pong';
}
}
Computer.pingpong(); *// 'ping pong'*