Typescript语法二

继承

继承是⾯向对象编程中的重要机制,允许⼀个类(⼦类或派⽣类)继承另⼀个类(⽗类或基类)的属性和⽅法。⼦类可以直接使⽤⽗类的特性,并根据需要添加新的特性或覆盖现有的特性。这种机制赋予⾯向对象程序良好的扩展性。
下⾯通过⼀个例⼦演⽰继承的特性:
class Student extends Person {classNumber: string;constructer(id:number, name: string, classNumber: string) {super(id,name);this.classNumber = classNumber;}    introduce(): string {return super.introduce() + `, and I am a student`;}}let student = new Student(1, 'xiaoming','三年二班');
console.log(student.introduce());

注意:

        类的继承需要使用关键字extends

        子类构造器中需使用super()调用父类构造器对继承自父类的属性进行初始化。

        在子类可以使用this关键字访问继承自父类的属性和方法

        在子类中可以使用super关键字访问父类定义的方法

访问修饰符

访问修饰符(Access Modifiers)⽤于控制类成员(属性、⽅法等)的可访问性。TypeScript提供了三种访问修饰符,分别是private、protected和public。

class Person {private id: number;protected name: string;public age: number;constructor(id: number, name: string, age: number) {this.id = id;this.name = name;this.age = age;}
}class Student extends Person {}

说明:

        private 修饰的属性或方法是私有的,只能在声明它的类中被访问

        protected修饰的属性或方法是受保护的,只能在声明它的类和其子类中被访问。

        public修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是public的

接口(interface)

接口(interface)是面向对象编程中的另一个重要概念。接口通常会作为一种契约或规范让类(class)去遵守,确保类实现某些特定的行为或功能。

语法说明
接⼝定义
接⼝使⽤ interface 关键字定义,通常情况下,接⼝中只会包含属性和⽅法的声明,⽽不包含具体
的实现细节,具体的细节由其实现类完成。

interface Person {id: number;name: string;age: number;introduce(): void;    }    

接口实现

接⼝的实现需要⽤到 implements 关键字,实现类中,需要包含接⼝属性的赋值逻辑,以及接⼝⽅
法的实现逻辑。
class Student implements Person {id: number;name: string;age: number;constructor(id: number,name: string, age: number) {this.id = id;this.name = name;this.age = age;}introduce(): void {console.log('Hello,I am a student');}}

多态
多态是⾯相对象编程中的⼀个重要概念,它可以使同⼀类型的对象具有不同的⾏为。下⾯我们通过⼀个具体的案例来体会多态这⼀概念.
⾸先,再创建⼀个 Person 接⼝的实现类 Teacher ,如下:

class Teacher implements Person {id: number;name: string;age: number;constructor(id: number,name: string, age: number) {this.id = id;this.name = name;this.age = age;}introduce(): void {console.log('Hello,I am a Teacher');}}

然后分别创建一个Student对象和⼀个 Teacher 对象,注意两个对象的类型均可以设置Person ,如下:

let p1: Person = new Student(1, 'zhangsan', 17);
let p2: Person = new Teacher(2, 'list', 35)
最后分别调⽤ p1 p2 introduce() ⽅法,你会发现,同样是 Person 类型的两个对象,调⽤同⼀个 introduce() ⽅法时,表现出了不同的⾏为,这就是多态。

p1.introduce();  //Hello, I am a student
p2.introduce();  //Hello, I am a teacher

接口的作用(重点!!!)

在传统的⾯向对象编程的场景中,接⼝主要⽤于设计和组织代码,使代码更加容易扩展和维护。下⾯举例说明。
假如现在需要实现⼀个订单⽀付系统,按照⾯向对象编程的习惯,⾸先需要定义⼀个订单类
(Order),如下

class Order {totalAmount: number;constructor(totalAmount: number) {this.totalAmount = totalAmount;} pay() {console.log(`AliPay: ${this.totalAmount}`);}}
很容易预想到,这个系统将来可能需要⽀持其他的⽀付⽅式,为了⽅便代码⽀持新的⽀付⽅式,我们可以对代码进⾏如下改造。‘
⾸先定义⼀个⽀付策略的接⼝,接⼝中声明⼀个 pay ⽅法,⽤来规范实现类必须实现⽀付逻辑。
interface PaymentStrategy {pay(amount: number): void;
}
然后在订单类中增加⼀个 PaymentStrategy 的属性,并且在订单类中的 pay ⽅法中调⽤
PaymentStrategy pay ⽅法,如下

class Order {totalAmount: number;paymentStrategy: PaymentStrategy;constructor(totalAmount: number,paymentStrategy: PaymentStrategy) {this.totalAmount = totalAmount;this.paymentStrategy = paymentStrategy;    }pay() {this.paymentStrategy.pay(this.totalAmount);}}

这样改造完之后,就可以很容易的在不改变现有代码的情况下,支持新的支付方式了。

⽐如现在需要⽀持 AliPay ,那我们就可以创建 AliPay 这个类(class)并实现(implement)
PaymentStrategy 这个接⼝,如下

class AliPay implements PaymentStrategy {pay(amount: number): void {console.log(`AliPay:${amount}`);}
}
这样⼀来,之后创建的订单就可以使⽤ AliPay 这个⽀付⽅式了。

let order = new Order(1000,new AliPay());
order.pay();

稍等

就上面的代码我要讲一下。

this.paymentStrategy.pay(this.totalAmount)   是什么意思?

它就是利用当前订单对象所持有的支付策略对象来处理支付操作。使用策略模式的好处在于,可以将支付逻辑与订单对象的其他功能分离开来。

TS中的接口的特殊性

        TypeScript中的接口是一个⾮常灵活的概念,除了⽤作类的规范之外,也常⽤于直接描述对象的类型,例如,现有⼀个变量的定义如下:

let person: {name:string, age:number, gender:string} = {name:'张三', age:10, gender:'男'};
⾮常灵活的概念,除了⽤作类的规范之外,也常⽤于直接描述对象的类型,例如,现有⼀个变量的定义如下:
interface Person {name: sting;age: number;gender: string;}let person: Person = {name:'张三', age:10, gender:'男'};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/7062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

头歌 实验六 Java流式编程与网络程序设计

实验六 Java流式编程与网络程序设计 制作不易!点个关注,给大家带来更多的价值 第1关 字节输入/输出流实现数据的保存和读取 package step1;import java.io.*; import java.util.*;public class SortArray {public static void main(String[] args) {/…

getchar和putchar函数详解

getchar和putchar函数详解 1.getchar函数1.1函数概述1.2函数返回值1.3函数注意事项1.4函数的使用 2.putchar函数2.1函数概述2.2函数返回值2.3函数使用实例 1.getchar函数 1.1函数概述 从一个流中读取一个字符,或者从标准输入中获得一个字符 函数原型: …

Sa-Token框架入门使用

说明:Sa-Token是一个轻量级java权限认证框架(官方语),所谓权限认证框架,就是登录框架,像Shiro、Spring Security。本文介绍Sa-Token框架的入门使用,基于Spring Boot环境。 准备工作 首先&…

滑动窗口 | 1652. 拆炸弹 |LeetCode

文章目录 题目介绍暴力(可以过力扣竟然。不愧是简单题):滑动窗口 祝你天天开心 题目介绍 你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。 为了获得正确的密码,你需要替换掉每…

第12章 消息服务 ❤❤❤❤

第12章 消息服务 12.1 JMS_ActiveMQ1. 简介2. ActiveMQ安装Linux安装命令问题1:网页访问不了问题2: 修改密码3. 整合SpringBoot3.1 依赖3.2 配置3.3 JmsComponent 组件3.4 测试12.2 AMQP_RabbitMQ1. 简介2. RabbitMQ

spring boot使用redis 存储数据时 字段为时间类型为LocalDateTime 发现存储到redis变成了对象

在项目中从redis获取带有LocalDateTime类型属性的对象时出现了以下异常: "createTime": {"dayOfYear":141,"dayOfWeek":"WEDNESDAY","month":"MAY","dayOfMonth":20,"year":2020…

代码随想录第四十五天|爬楼梯、零钱兑换、完全平方数

题目链接:57. 爬楼梯(第八期模拟笔试) 代码如下: 题目链接:. - 力扣(LeetCode) 代码如下: 题目链接:. - 力扣(LeetCode) 代码如下:…

Vue阶段练习:初始化渲染、获取焦点、记账清单

阶段练习主要承接Vue 生命周期-CSDN博客 ,学习完该部分内容后,进行自我检测,每个练习主要分为效果显示、需求分析、静态代码、完整代码、总结 四个部分,效果显示和准备代码已给出,我们需要完成“完整代码”部分。 练习…

关系型数据库MySql分库分表带来的问题以及解决方案

水平分表 水平分表是什么? 将一张表横向拆分为多张表,拆分的表,依然在同一个库中。 例如,user表有400w条记录,将user表拆分成4张表,每张表100w条记录。拆分后的表名,分别叫做user_0、user1、u…

powershell 监控Windows资源管理器选中的文件夹及文件

powershell 监控Windows资源管理器选中的文件夹及文件 01 前言 在整理大量文件的时候,有些文件可能需要根据内容做不同的处理,比如,移动到另外一个目录中。那么如何判断当前在文件资源管理器中选择了哪些文件呢?决定用powershel…

基于 Linux 自建怀旧游戏之 - 80 款 H5 精品小游戏合集

1)简介 最近又找到了一款宝藏游戏资源分享给大家,包含 80 款 H5 精品小游戏,都是非常有趣味耐玩的游戏,比如 植物大战僵尸、捕鱼达人、贪吃蛇、俄罗斯方块、斗地主、坦克大战、双人五子棋、中国象棋 等等超级好玩的 H5 小游戏&…

CUDA调整指令级原语

在GPU上运行的运算密集型应用程序,处理器的计算吞吐量可以用它在一段时间内执行操作的数量来衡量。因为GPU有很多SIMT指令和计算核心,所以其峰值计算吞吐量通常比其他的处理器高。 对应用程序的吞吐量和正确性进行优化时,理解不同低级原语的…

常见通信协议

1、串口:(串行异步全双工,先发低位) 因为是异步的,所以没有时钟线,因为是全双工,所以有两条数据传输线,实现数据的收发。 帧格式 起始位1位,数据位8位,校验…

go语言常用的内置数据类型别名byte, rune 和any, error接口 定义和使用说明

本文描述了go语言中常用的一些类型别名和接口的定义和使用说明, 最为常用的就是 byte, rune, Type, any 还有 error , 详情如下: 8位无符号整数,表示范围 0--127 type uint8 uint8 byte uint8的别名,用来表示8位无符号整数&am…

【教程】极简Python接入免费语音识别API

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,请不吝给个[点赞、收藏、关注]哦~ 安装库: pip install SpeechRecognition 使用方法: import speech_recognition as srr sr.Recognizer() harvard sr…

LeetCode 面试经典150题 228.汇总区间

题目: 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区…

spring高级篇(九)

boot的执行流程分为构造SpringApplication对象、调用run方法两部分 1、Spring Boot 执行流程-构造 通常我们会在SpringBoot的主启动类中写以下的代码: 参数一是当前类的字节码,参数二是main的args参数。 public class StartApplication {public static…

MySQL商城数据表(80-84)

80商品规格值表 DROP TABLE IF EXISTS niumo_spec_items; CREATE TABLE niumo_spec_items (itemId int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,shopId int(11) NOT NULL DEFAULT 0 COMMENT 店铺ID,catId int(11) NOT NULL DEFAULT 0 COMMENT 类型ID,goodsId int(11) NOT…

【Linux IO基础】缓冲区

概念 缓冲区的主要作用是提高效率 --- 提高使用者的效率,因为有缓冲区的存在,我们可以积累一部分再统一发送,提高发送的效率。 刷新方式 缓冲区因为能够暂存数据,必定要有一定的刷新方式: 一般策略: 无…

Flask应用的部署和使用,以照片分割为例。

任务是本地上传一张照片,在服务器端处理后,下载到本地。 服务器端已经封装好了相关的程序通过以下语句调用 from amg_test import main from test import test main() test() 首先要在虚拟环境中安装flask pip install Flask 文件组织架构 your_pro…