MST

星途 面试题库

面试题:TypeScript中实例成员与静态成员在继承体系下的行为

在TypeScript里,定义一个父类包含实例成员和静态成员,再定义一个子类继承自该父类。请描述并通过代码展示子类对父类实例成员和静态成员的继承、重写情况,以及在不同场景下访问这些成员的规则。
28.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

在TypeScript中,子类可以继承父类的实例成员和静态成员,并且可以重写实例成员,但静态成员不能被重写(严格来说,静态成员在子类中重新定义属于定义新的静态成员,并非重写)。以下是代码示例及说明:

// 定义父类
class Parent {
    // 实例成员
    instanceProperty: string;

    constructor(instanceProperty: string) {
        this.instanceProperty = instanceProperty;
    }

    instanceMethod(): string {
        return `Parent instance method: ${this.instanceProperty}`;
    }

    // 静态成员
    static staticProperty: number = 42;

    static staticMethod(): string {
        return `Parent static method: ${Parent.staticProperty}`;
    }
}

// 定义子类继承自父类
class Child extends Parent {
    // 重写实例成员
    instanceMethod(): string {
        return `Child instance method: ${this.instanceProperty}`;
    }

    // 定义新的静态成员(并非重写)
    static newStaticProperty: string = "new static value";

    static newStaticMethod(): string {
        return `Child new static method: ${Child.newStaticProperty}`;
    }
}

// 访问实例成员
const parentInstance = new Parent("parent value");
console.log(parentInstance.instanceMethod()); // 输出: Parent instance method: parent value

const childInstance = new Child("child value");
console.log(childInstance.instanceMethod()); // 输出: Child instance method: child value

// 访问静态成员
console.log(Parent.staticMethod()); // 输出: Parent static method: 42
console.log(Child.staticMethod()); // 输出: Parent static method: 42,子类继承父类静态方法
console.log(Child.newStaticMethod()); // 输出: Child new static method: new static value

继承和重写情况说明

  1. 实例成员
    • 继承:子类自动继承父类的实例成员,包括属性和方法。
    • 重写:子类可以通过在自身定义同名的实例方法来重写父类的实例方法。在重写时,方法签名(参数列表和返回类型)必须与父类方法一致。
  2. 静态成员
    • 继承:子类继承父类的静态成员,可以通过子类名直接访问父类的静态方法和属性。
    • 重写:TypeScript中,静态成员不能像实例成员那样被重写。如果在子类中定义了与父类同名的静态成员,这实际上是在子类中定义了一个新的静态成员,与父类的静态成员没有重写关系。

访问规则

  1. 实例成员
    • 通过父类实例访问父类实例成员。
    • 通过子类实例访问子类重写后的实例成员,如果子类没有重写,则访问父类的实例成员。
  2. 静态成员
    • 通过父类名访问父类静态成员。
    • 通过子类名访问父类继承下来的静态成员以及子类自己定义的新静态成员。