面试题-TS(四):如何在 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
的类,它具有name
和age
属性,以及一个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中,我们可以使用访问修饰符来限制类的属性和方法的访问。以下是几个常用的访问修饰符:
public
(默认):可以在类内部和外部访问。private
:只能在类内部访问。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中充分利用类和继承的优势,将提升我们的开发效率和代码质量。
相关文章:
面试题-TS(四):如何在 TypeScript 中使用类和继承?
面试题-TS(4):如何在 TypeScript 中使用类和继承? 在TypeScript中,类是一种重要的概念,它允许我们使用面向对象的编程风格来组织和管理代码。类提供了一种模板,用于创建具有相同属性和行为的对象。通过继承࿰…...
React之JSX的介绍与使用步骤,注意事项,条件渲染,列表渲染以及css样式处理
React之JSX的介绍与使用 一、JSX的介绍二、JSX使用步骤三、JSX注意事项四、JSX中使用JavaScript表达式五、条件渲染六、列表渲染七、CSS样式处理八、JSX 总结 一、JSX的介绍 简介 JSX是JavaScript XML的简写,表示了在Javascript代码中写XML(HTML)格式的代码 优势 声…...
sql进阶:求满足某列数值相加无限接近90%的行(90分位)
sql 一、案例分析二、思路三、代码实现一、案例分析 表中有某个id列和数值列,求数值列占比为90%的id,如有个用户表,存储id和消费金额order_cnt,求一条sql查出消费占比无限接近90%的所有客户,如表中总消费为10000,占比最高的是4000、3000、2800,对应A、B、C用户,查出A、B、C用户…...

设计模式大白话——观察者模式
文章目录 一、概述二、示例三、模式定义四、其他 一、概述 与其叫他观察者模式,我更愿意叫他叫 订阅-发布模式 ,这种模式在我们生活中非常常见,比如:追番了某个电视剧,当电视剧有更新的时候会第一时间通知你。当你…...
机器学习小记-序
机器学习是人工智能的一个重要分支,根据学习任务的不同,可以将机器学习分为以下几类: 监督学习(Supervised Learning): 应用场景:监督学习适用于已标记数据集的任务,其中每个样本都有…...

IP基础知识总结
IP他负责的是把IP数据包在不同网络间传送,这是网络设计相关的,与操作系统没有关系。所以这部分知识,不是网络的重点。IP和路由交换技术联系紧密。但是要作为基本知识点记住。 一、基本概念 网络层作用:实现主机与主机之间通信。 …...
Java设计模式-单例模式
单例模式 1.单例模式含义 单例模式就是保证一个类仅有一个实例,并提供一个访问它的全局访问点。 其实单例模式很好理解,当我们new一个对象实例的时候,这个对象会被放到一个内存中,当我们再次new同一个对象的实例的时候…...

小程序----配置原生内置编译插件支持sass
修改project.config.json配置文件 在 project.config.json 文件中,修改setting 下的 useCompilerPlugins 字段为 ["sass"], 即可开启工具内置的 sass 编译插件。 目前支持三个编译插件:typescript、less、sass 修改之后可以将原.w…...

GitLab 删除项目
1.点击头像 2.点击Profile 3.选择要删除的项目点进去 4.settings-general-Advances-expand 5.然后在弹出框中输入你要删除的项目名称即可...

Mac m1 下eclipse下载及jdk环境变量配置
一、安装eclipse 1、下载eclipse Eclipse downloads - Select a mirror | The Eclipse Foundation 此版本为m1芯片适用版本 2、下载后下一步安装即可 安装成功后,可以看到图标: 二、安装jdk 1、下载jdk 下载此版本即可,下载完成之后一直…...
Java中List与数组之间的相互转换
一、List列表与对象数组 List列表中存储对象,如List<Integer>、List<String>、List<Person>,对象数组中同样存储相应的对象,如Integer[]、String[]、Person[],对象数组与对象List的转换可通过如下方式实现&…...

嵌入式_GD32看门狗配置
嵌入式_GD32独立看门狗配置与注意事项 文章目录 嵌入式_GD32独立看门狗配置与注意事项前言一、什么是独立看门狗定时器(FWDGT)二、独立看门狗定时器原理三、独立看门狗定时器配置过程与注意事项总结 前言 使用GD3单片机时,为了提供了更高的安…...

Python 中的 JSON 操作:简单、高效的数据交换格式
在现代的数据交换和存储中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,备受青睐。它不仅易于阅读和理解,还可以灵活地表达和存储高维数据。本文将介绍如何在 Python 中操作 JSON 文件,…...
IT行业面试攻略:技巧与心态的平衡
引言:在面试IT公司时,调整好心态是取得优秀表现的关键。面试心态直接影响着我们在面试中的自信程度和表现。面对这一挑战,我们需要学会积极自信、认识到紧张是正常的、进行充分准备以及以积极的心态去迎接面试。只有在拥有正确的心态下&#…...

【玩转Linux】标准io缓冲区的操作
(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…...

28.JavaWeb-Elasticsearch
1.Elasticsearch概述 Elasticsearch 是一个分布式的全文检索引擎。采用Java语言开发,基于Apache协议的开源项目,具有实时搜索,稳定,可靠,快速的特点。 1.1 全文检索引擎 分为通用搜索引擎(百度、谷歌&…...

Python Flask构建微信小程序订餐系统 (十)
🔥 编辑会员信息 🔥 编辑会员信息可以通过点击会员列表操作,也可以点击会员信息详情点击进行操作 🔥 修改编程会员信息列表布局 🔥 修改 web/templates/member/index.html 文件,添加跳转到编辑会员信息的页面 web/templates/member/set.html 🔥 创建用于会员…...
j2ee相关知识点
浏览器栏中,输入的是servlet的mapping映射,请求到servlet中去,jsp路径,会跳转到对应的页面 Servlet接口位于最顶端,GenericServlet实现了Servlet,HttpServlet继承了GenericServlet 浏览器中访问Servlet映…...
Shell脚本学习-eval内置命令
这个命令,平时接触不是很多,所以不知道是什么回事。 eval内置命令: 功能:当Shell程序执行到eval语句的时候,Shell读入参数args,并将它们组合成一个新的命令,然后执行。也就是重新运算求出参数的…...

word中将合并后的多行拆分为原先的行数
word中将已经合并的多行拆分为原先的行数,我们不用刻意去数应该是多少行, 只需将拆分的行数不断增加,word会默认最大增加到合并前的行数。...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...

Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集
目录 一、引言:当爬虫遭遇"地域封锁"二、背景解析:分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计:Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...

NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB,助力企业 AI 应用高效落地
NineData 的数据库 DevOps 解决方案已完成对百度智能云向量数据库 VectorDB 的全链路适配,成为国内首批提供 VectorDB 原生操作能力的服务商。此次合作聚焦 AI 开发核心场景,通过标准化 SQL 工作台与细粒度权限管控两大能力,助力企业安全高效…...