보통 자식 클래스를 subclass, 부모 클래스를 superclass라 한다.
class Animal {
move(distanceInMeters: number = 0) {
console.log(`Animal moved ${distanceInMeters}`)
}
}
class Dog extends Animal { // 부모 Animal을 상속받은 자식 Dog
bark() {
console.log('Bark!')
}
}
const dog = new Dog()
dog.bark()
dog.move(10) // Can use superclass's methods or properties
dog.bark()
자식 클래스에서 부모 클래스에 접근하기 위해서는 super를 사용한다.
class Animal { // 부모
name: string;
constructor(theName: string) {this.name = theName}
move(distanceInMeters: number = 0) {
console.log(`${this.name} moved ${distanceInMeters}`)
}
}
class Snake extends Animal { // 자식1
constructor(name: string) { **super(name)** } // super is necessary
move(distanceInMeters: number = 5) { // overloading
console.log("Slithering....")
**super.move(distanceInMeters)**
}
}
class Horse extends Animal { // 자식2
constructor(name: string) { **super(name)** } // super is necessary
move(distanceInMeters: number = 45) { // overloading
console.log("Galloping...")
**super.move(distanceInMeters)**
}
}
const snake = new Snake("snakey") // "Slithering...."
snake.move(1) // "snakey moved 1"
super는 필수이다
부모에 생성자가 없는 상태에서 자식이 자신의 생성자를 사용하려 하면 꼭 super를 사용해야 한다고 한다.
class Animal { // 생성자 없는 부모
name: string='snake';
move(distanceInMeters: number = 0) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
class Snake extends Animal {
constructor(name: string) { this.name = name } // 에러!!!!!!!!!!!!!!!!!!
move(distanceInMeters = 5) {
console.log("Slithering...");
super.move(distanceInMeters);
}
}
let sam = new Snake();
왜 부모에게 생성자가 없는데 꼭 자식에서 super를 사용해야 하는가?
그래야만 하는 이유는 생성자를 명시적으로 설정해주지 않아도 자동으로 생성자가 생기기 때문이다.
console.log(Animal)
// 결과
class Animal {
constructor() { // 자동으로 생긴다! 클래스의 속성들이 자동으로 들어가게 된다.
this.name = 'asd';
}
move(distanceInMeters = 0) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}