TypeScript에서 코드를 작성하여 C# 디자인 패턴 책을 따라하려고합니다. 어쩌면 이것이 내가 처음 실수 한 것일 수도 있지만 언어를 배우는 것이 즐겁습니다.추상 클래스를 시뮬레이트하고 해당 생성자를 호출하려면 어떻게해야합니까?
TypeScript는 클래스의 추상 키워드를 지원하지 않으므로 시뮬레이션하려고합니다. 어쩌면이게 내 두 번째 실수 야.
은 여기 내 인터페이스와 클래스입니다 :
interface IEngine {
getSize(): number;
getTurbo(): boolean;
}
class AbstractEngine implements IEngine {
constructor(private size: number, private turbo: boolean) {
throw "Abstract class";
}
public getSize(): number {
return this.size;
}
public getTurbo(): boolean {
return this.turbo;
}
public toString(): string {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(this.constructor.toString());
var className = (results && results.length > 1) ? results[1] : '';
return className + " (" + this.size + ")";
}
}
class StandardEngine extends AbstractEngine {
constructor(size: number) {
// not turbo charged
super(size, false);
}
}
예상대로 내가 "추상 클래스입니다"오류가 new AbstractEngine(1, true)
과 AbstractEngine를 인스턴스화하려고합니다.
new StandardEngine(9000)
으로 StandardEngine을 인스턴스화하려고하면 "추상 클래스"오류가 발생합니다.
TypeScript에서 추상 클래스를 시뮬레이트 할 수있는 방법이 있습니까? 인스턴스화 할 수 없지만 확장하는 클래스에서 여전히 super를 호출 할 수 있습니까? 그리고 추상적 인 메소드를 시뮬레이트하는 것은 어떨까요? 나는 그것을 보호 할 수 있습니까? 여전히 슈퍼 메소드를 호출 할 수 있습니까?
그러나 StandardEngine뿐만 아니라 여러 가지 구체적인 클래스에 걸쳐 AbstractEngine의 구현을 공유 할 수 있어야합니다. 미안하다. 나는 그 사실을 내 포스트에서 분명히하지 않았다. 나는 당신의 솔루션이 그것을 어떻게 달성 하는지를 보지 못합니다. * 편집 * 아, 신경 쓰지 마세요, 여러 구체적인 수업에 걸쳐 코드를 공유하는 믹스 인에 대해 언급했습니다. 나는 그것을 시도해야 할 것이다. – brycedarling
mixins을 사용하여 이것을 구현 한 후에, StandardEngine과 TurboEngine 클래스에 얼마나 많은 코드를 복사해야하는지 조금 실망했습니다. 이 문제를 해결하고 applyMixins 또는 추상 클래스 또는 둘 다를 호출해야하는 필요성을 제거한 키워드가 있었으면합니다. – brycedarling
또한 상속을 사용했을 때처럼 "StandardEngine"또는 "TurboEngine"대신 mixin으로 구현 될 때 엔진의 사용자 정의 toString 메소드는 항상 클래스 이름으로 "Engine"을 인쇄합니다. – brycedarling