반응형
final 클래스 흉내 내기
TypeScript는 클래스나 메서드에 final 키워드를 지원하지 않지만 클래스에서 final의 효과를 흉내내기 어렵지 않습니다.
final 키워드는 클래스나 메서드를 확장하거나 오버라이드할 수 없게 만드는 기능입니다.
TypeScript에선 비공개 생성자(private constructor)로 final 클래스를 흉내 낼 수 있습니다.
class MessageQueue {
private constructor(private message: string[]) {}
}
생성자를 private으로 선언하면 new로 인스턴스를 생성하거나 클래스를 확장할 수 없게 됩니다.
class MessageQueue {
private constructor(private message: string[]) {}
}
class BadQueue extends MessageQueue{} // 'MessageQueue' 클래스를 확장할 수 없습니다. 클래스 생성자가 private로 표시되어 있습니다.ts(2675)
new MessageQueue([]) // 'MessageQueue' 클래스의 생성자는 private이며 클래스 선언 내에서만 액세스할 수 있습니다.ts(2673)
클래스 상속만 막아야 하는 상황이지만 비공개 생성자를 이용하면 클래스를 인스턴스화하는 기능도 같이 사라집니다.
반면, final 클래스는 상속만 막을 뿐 인스턴스는 정상적으로 만들 수 있습니다.
이 문제는 아래처럼 쉽게 해결할 수 있습니다.
class MessageQueue {
private constructor(private messages: string[]){}
static create(messages: string[]){
return new MessageQueue(messages)
}
}
MessageQueue의 API를 조금 바꿨지만 컴파일 타임에 성공적으로 확장을 막을 수 있습니다.
class MessageQueue {
private constructor(private messages: string[]){}
static create(messages: string[]){
return new MessageQueue(messages)
}
}
class BadQueue extends MessageQueue{} // 'MessageQueue' 클래스를 확장할 수 없습니다. 클래스 생성자가 private로 표시되어 있습니다.ts(2675)
MessageQueue.create([])
반응형
'👶 TypeScript' 카테고리의 다른 글
디자인 패턴 - 빌더 패턴(builder pattern) (0) | 2023.01.17 |
---|---|
디자인 패턴 - 팩토리 패턴(factory pattern) (0) | 2023.01.17 |
데코레이터(decorator) (0) | 2023.01.16 |
믹스인(mixin) (0) | 2023.01.16 |
다형성 (0) | 2023.01.16 |