your programing

TypeScript에서 순수 추상 클래스 확장 및 구현

lovepro 2020. 12. 30. 19:52
반응형

TypeScript에서 순수 추상 클래스 확장 및 구현


순수한 추상 클래스 (즉, 구현이없는 추상 클래스)가 있다고 가정합니다.

abstract class A {
    abstract m(): void;
}

C # 및 Java와 마찬가지로 추상 클래스를 확장 할 수 있습니다 .

class B extends A {
    m(): void { }
}

그러나 C # 및 Java 와 달리 추상 클래스를 구현할 수도 있습니다 .

class C implements A {
    m(): void { }
}

수업 BC행동은 어떻게 다릅니 까? 왜 하나를 선택해야합니까?

(현재 TypeScript 핸드북언어 사양 은 추상 클래스를 다루지 않습니다.)


구현 키워드 취급 수단한다는 인터페이스로는 A 클래스 C는 정의되지 모든 방법을 구현해야 그들이에서 구현하거나하지 않은 경우에 상관없이, . 또한 C 에는 슈퍼 메서드에 대한 호출이 없습니다 .

extends 는 키워드에서 기대하는 것과 더 비슷하게 작동합니다. 추상 메소드 만 구현해야하며 수퍼 호출이 사용 가능 / 생성됩니다.

추상적 인 방법의 경우에는 차이가 없다고 생각합니다. 그러나 추상 메서드 만 있는 클래스거의 없습니다. 그렇게한다면 인터페이스로 변환하는 것이 훨씬 낫습니다 .

생성 된 코드를 보면 쉽게 알 수 있습니다. 여기에 놀이터 예제를 만들었습니다 .


나는 방금 나 자신에게 같은 질문을하고 있었기 때문에 여기로 이끌 렸고 대답을 읽는 동안 선택이 instanceof운영자 에게도 영향을 미칠 것이라는 답을 읽었습니다 .

추상 클래스는 JS로 내보내지는 실제 값이므로 서브 클래스가이를 확장 할 때 런타임 검사에 사용할 수 있습니다.

abstract class A {}

class B extends A {}

class C implements A {}

console.log(new B() instanceof A) // true
console.log(new C() instanceof A) // false

바탕 toskv의 대답 @ 당신이 경우, 확장 추상 클래스를, 당신은 전화를해야 super()하위 클래스의 생성자에서. 추상 클래스 구현 하는 경우 호출 할 필요가 없습니다 super()(그러나 개인 메서드를 포함하여 추상 클래스에 선언 된 모든 메서드를 구현해야 함).

확장하는 대신 추상 클래스를 구현하는 것은 원래 클래스의 종속성 및 생성자에 대해 걱정할 필요없이 테스트 용 모의 클래스를 생성하려는 경우 유용 할 수 있습니다.


당신이 제공하는 확장의 예에서 실제로 클래스에 새로운 것을 추가하지 않습니다. 그래서 그것은 아무것도 확장되지 않습니다. 아무것도 확장하지 않는 것이 유효한 Typescript이지만이 경우 '구현'이 더 적절할 것 같습니다. 그러나 결국에는 동등합니다.

참조 URL : https://stackoverflow.com/questions/35990538/extending-vs-implementing-a-pure-abstract-class-in-typescript

반응형