面试题答案
一键面试抽象类的继承特点和规则
- 抽象类不能被实例化:抽象类主要为子类提供一个通用的基类,自身不能被直接创建实例。
- 抽象方法必须在子类中实现:抽象类中可以包含抽象方法(没有方法体的方法),子类继承抽象类时必须实现这些抽象方法,否则子类也必须声明为抽象类。
- 子类可重写抽象类的非抽象方法:抽象类中的非抽象方法,子类可以选择重写以满足自身需求。
接口的实现特点和规则
- 类可以实现多个接口:与继承抽象类不同,一个类可以同时实现多个接口,这使得类具有更灵活的功能组合。
- 实现接口的类必须实现接口中的所有成员:接口定义了一组成员(属性、方法等),实现接口的类必须确保提供这些成员的具体实现。
- 接口只定义契约,不包含实现:接口只规定了类应该具有哪些成员,而不关心这些成员如何实现。
代码结构差异示例
// 抽象类定义
abstract class Animal {
constructor(public name: string) {}
abstract speak(): void;
move(): void {
console.log(`${this.name} is moving.`);
}
}
// 继承抽象类
class Dog extends Animal {
speak(): void {
console.log(`${this.name} barks.`);
}
}
// 接口定义
interface Flyable {
fly(): void;
}
// 实现接口
class Bird implements Flyable {
constructor(public name: string) {}
fly(): void {
console.log(`${this.name} is flying.`);
}
}
// 类继承抽象类并实现接口
class Pegasus extends Animal implements Flyable {
constructor(name: string) {
super(name);
}
speak(): void {
console.log(`${this.name} neighs.`);
}
fly(): void {
console.log(`${this.name} is flying gracefully.`);
}
}
在上述代码中,Dog
类继承自 Animal
抽象类,必须实现 Animal
中的抽象方法 speak
。而 Bird
类实现 Flyable
接口,必须实现 fly
方法。Pegasus
类既继承了 Animal
抽象类,又实现了 Flyable
接口,需要同时实现抽象类中的抽象方法和接口中的方法。从代码结构上能清晰看出继承抽象类和实现接口的不同之处,继承抽象类是一种 “is - a” 的关系(如 Dog
是一种 Animal
),而实现接口更强调 “can - do” 的能力(如 Bird
能 fly
)。