面试题-TS(四):如何在 TypeScript 中使用类和继承?

简介: 在TypeScript中,类是一种重要的概念,它允许我们使用面向对象的编程风格来组织和管理代码。类提供了一种模板,用于创建具有相同属性和行为的对象。通过继承,我们可以创建类之间的层次结构,实现代码的重用和扩展。

面试题-TS(4):如何在 TypeScript 中使用类和继承?

在TypeScript中,类是一种重要的概念,它允许我们使用面向对象的编程风格来组织和管理代码。类提供了一种模板,用于创建具有相同属性和行为的对象。通过继承,我们可以创建类之间的层次结构,实现代码的重用和扩展。

1. 类的定义和使用

在TypeScript中,我们使用class关键字来定义类。以下是一个简单的类的示例:

class Person {
   
  name: string;
  age: number;

  constructor(name: string, age: number) {
   
    this.name = name;
    this.age = age;
  }

  greet(): void {
   
    console.log(`Hello, my name is ${this.name}. I'm ${this.age} years old.`);
  }
}

在上面的示例中,我们定义了一个名为Person的类,它具有nameage属性,以及一个greet方法。构造函数用于初始化对象的属性。

创建类的实例非常简单,只需使用new关键字加上类的构造函数即可:

let person = new Person("John", 25);
person.greet();  // 输出:Hello, my name is John. I'm 25 years old.

通过类的定义,我们可以创建多个具有相同属性和行为的对象,实现代码的复用和封装。

2. 继承和子类

在面向对象编程中,继承是一种重要的概念。通过继承,我们可以创建一个类的子类(也称为派生类),并继承其属性和方法。子类可以扩展或修改父类的功能,从而实现代码的重用和扩展。

在TypeScript中,我们使用extends关键字来指定一个类继承自另一个类。以下是一个简单的继承示例:

class Student extends Person {
   
  studentId: string;

  constructor(name: string, age: number, studentId: string) {
   
    super(name, age);
    this.studentId = studentId;
  }

  study(): void {
   
    console.log(`Student ${this.name} is studying with student ID ${this.studentId}.`);
  }
}

在上面的示例中,我们定义了一个名为Student的子类,它继承自Person父类。子类具有自己的属性studentId,并通过调用super关键字来调用父类的构造函数。

创建子类的实例与创建父类的实例类似:

let student = new Student("Alice", 20, "12345");
student.greet();  // 输出:Hello, my name is Alice. I'm 20 years old.
student.study();  // 输出:Student Alice is studying with student ID 12345.

通过继承和创建子类的实例,我们可以使用父类的属性和方法,并且可以扩展子类的功能。

3. 方法的重写

子类可以重写(override)父类的方法,以实现特定的行为。通过在子类中重新定义与父类相同名称的方法,可以覆盖父类中的方法实现。

以下是一个重写父类方法的示例:

class Teacher extends Person {
   
  subject: string;

  constructor(name: string, age: number, subject: string) {
   
    super(name, age);
    this.subject = subject;
  }

  greet(): void {
   
    console.log(`Hello, my name is ${this.name}. I teach ${this.subject}.`);
  }
}

在上面的示例中,我们定义了一个名为Teacher的子类,它继承自Person父类,并重写了父类的greet方法。通过重写,我们可以在子类中定制特定的行为。

创建子类的实例并调用重写后的方法:

let teacher = new Teacher("Mr. Smith", 35, "Math");
teacher.greet();  // 输出:Hello, my name is Mr. Smith. I teach Math.

通过方法的重写,我们可以根据子类的需求来修改或扩展父类的行为。

4. 访问修饰符

在TypeScript中,我们可以使用访问修饰符来限制类的属性和方法的访问。以下是几个常用的访问修饰符:

  1. public(默认):可以在类内部和外部访问。
  2. private:只能在类内部访问。
  3. protected:可以在类内部和子类中访问,但不能在类外部访问。

例如

class Person {
   
  public name: string;
  private age: number;
  protected gender: string;

  constructor(name: string, age: number, gender: string) {
   
    this.name = name;
    this.age = age;
    this.gender = gender;
  }

  sayHi() {
   
    console.log(`Hi, my name is ${
     this.name}.`);
  }

  private sayAge() {
   
    console.log(`I am ${
     this.age} years old.`);
  }
}

class Student extends Person {
   
  constructor(name: string, age: number, gender: string) {
   
    super(name, age, gender);
  }

  sayGender() {
   
    console.log(`My gender is ${
     this.gender}.`);
  }
}

let person = new Person("Tom", 18, "male");
console.log(person.name); // "Tom"
console.log(person.age); // Error: Property 'age' is private and only accessible within class 'Person'.
console.log(person.gender); // Error: Property 'gender' is protected and only accessible within class 'Person' and its subclasses.

let student = new Student("Jane", 20, "female");
console.log(student.gender); // "female"

通过使用访问修饰符,我们可以控制类的成员的可见性,增强了封装性和安全性。

5. 抽象类

在TypeScript中,我们还可以使用抽象类(abstract class)来定义一个不可实例化的基类。抽象类提供了一种模板,用于派生其他类,并定义了一些必须由子类实现的抽象方法。抽象类不能被直接实例化,只能被继承。

以下是一个抽象类的示例:

abstract class Shape {
   
  abstract calculateArea(): number;
}

class Rectangle extends Shape {
   
  width: number;
  height: number;

  constructor(width: number, height: number) {
   
    super();
    this.width = width;
    this.height = height;
  }

  calculateArea(): number {
   
    return this.width * this.height;
  }
}

在上面的示例中,我们定义了一个抽象类Shape,它具有一个抽象方法calculateArea。子类Rectangle继承自Shape,并实现了calculateArea方法。

通过抽象类,我们可以定义一些基础的行为和方法,并强制子类实现这些方法,从而实现了代码的规范和扩展性。

总结

使用类和继承可以使我们的代码更具结构和可读性,减少重复代码,并实现高度灵活和可扩展的应用程序。在TypeScript中充分利用类和继承的优势,将提升我们的开发效率和代码质量。

相关文章
|
2月前
|
JavaScript
typeScript基础(3)_ts函数默认值和可选参数
本文介绍了在TypeScript中如何使用函数的默认值和可选参数。展示了如何为函数参数指定默认值,使得在调用函数时可以省略某些参数,以及如何定义可选参数。
160 2
|
13天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
53 4
|
2月前
|
安全 Java 应用服务中间件
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
什么是类加载器,类加载器有哪些;什么是双亲委派模型,JVM为什么采用双亲委派机制,打破双亲委派机制;类装载的执行过程
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
|
1月前
|
JavaScript 前端开发
Vue2整合TypeScript:借助vue-property-decorator以类模式编写组件
Vue2整合TypeScript:借助vue-property-decorator以类模式编写组件
131 3
|
1月前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
20 1
|
1月前
|
JavaScript 索引
TypeScript(TS)安装指南与基础教程学习全攻略(二)
TypeScript(TS)安装指南与基础教程学习全攻略(二)
52 0
|
1月前
|
JavaScript 前端开发 安全
TypeScript(TS)安装指南与基础教程学习全攻略(一)
TypeScript(TS)安装指南与基础教程学习全攻略(一)
29 0
|
2月前
|
JavaScript 前端开发
typeScript基础(8)_ts类型断言
本文介绍了TypeScript中的类型断言,它用于在编译时告诉TypeScript某个对象具有特定的类型,即使它看起来不具备。类型断言可以用来访问一个类型上存在而另一个类型上不存在的属性或方法。需要注意的是,类型断言并不会在运行时改变JavaScript的行为,因此如果断言不当,运行时仍然可能出错。文章还提醒避免将类型断言为`any`类型或进行多重断言。
36 1
|
2月前
|
JavaScript
typeScript进阶(13)_类与注意事项(八项特性)
TypeScript的类支持特性包括:构造函数、继承(使用`extends`)、公有/私有/受保护修饰符、只读修饰符、参数属性、存取器(getters/setters)、抽象类(用`abstract`声明)。类可用作类型。
23 0
typeScript进阶(13)_类与注意事项(八项特性)
|
3月前
|
Java
【Java集合类面试三十】、BlockingQueue中有哪些方法,为什么这样设计?
BlockingQueue设计了四组不同行为方式的方法用于插入、移除和检查元素,以适应不同的业务场景,包括抛异常、返回特定值、阻塞等待和超时等待,以实现高效的线程间通信。