TypeScript의 Liskov 대체 원칙

When extending a class, remember that you should be able to pass objects of the subclass in place of objects of the parent class without breaking the client code.



이 원칙의 목표는 하위 클래스가 상위 클래스의 동작과 호환되는 상태를 유지하는 것입니다. 하위 클래스는 상위 클래스의 동작을 확장해야 하며 다른 것으로 대체해서는 안 됩니다.

이 원칙을 따르면 클라이언트 코드를 손상시키지 않고 부모 클래스를 하위 클래스로 바꿀 수 있습니다.


주문을 받는 애플리케이션이 있다고 상상해 보십시오. 주문에는 초안 또는 확인의 두 가지 상태가 있습니다. 주문이 확인되지 않으면 결제가 불가능합니다.

다음 예에서는 상위 클래스에 오류가 발생하지 않는 메서드markAsPaid가 있으므로 대체 원칙을 깨고 있습니다. 반대로 하위 클래스DraftOrder는 발주 주문을 지불할 수 없기 때문에 해당 메서드에서 오류를 발생시킵니다. 부모 클래스Order를 하위 클래스DraftOrder로 교체하면 markAsPaid를 호출하는 경우 코드가 손상될 수 있습니다.

class Order {
  id: number;
  items: string[];
  payed: boolean;

  // constructor

  markAsPaid(): void {
    this.payed = true;
  }
}

class DraftOrder extends Order {
  markAsPaid(): void {
    throw new Error("Draft orders can't be payed");
  }
}


초안 주문을 상위 클래스로 만들고 확정된 주문을 하위 클래스로 만들어 이를 개선할 수 있습니다. 이렇게 하면 코드를 손상시키지 않고 상위 클래스를 하위 클래스로 대체할 수 있습니다.

class Order {
  id: number;
  items: string[];

  // constructor
}

class ConfirmedOrder extends Order {
  payed: boolean;

  // constructor

  markAsPaid(): void {
    this.payed = true;
  }
}

좋은 웹페이지 즐겨찾기