TypeScript 从入门到进阶之基础篇(十) 抽象类篇

请添加图片描述

系列文章目录

TypeScript 从入门到进阶系列

  1. TypeScript 从入门到进阶之基础篇(一) ts基础类型篇
  2. TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇
  3. TypeScript 从入门到进阶之基础篇(三) 元组类型篇
  4. TypeScript 从入门到进阶之基础篇(四) symbol类型篇
  5. TypeScript 从入门到进阶之基础篇(五) 枚举类型篇
  6. TypeScript 从入门到进阶之基础篇(六) 类型(断言 、推论、别名)| 联合类型 | 交叉类型 篇
  7. TypeScript 从入门到进阶之基础篇(七)泛型篇
  8. TypeScript 从入门到进阶之基础篇(八)函数篇
  9. TypeScript 从入门到进阶之基础篇(九) Class类篇
    持续更新中…

文章目录

  • 系列文章目录
  • TypeScript 从入门到进阶系列
  • 前言
  • 一、抽象类(abstract)的使用
  • 二、抽象类(abstract)的使用场景


前言

TypeScript 抽象类是一种用于定义其他类的基础类,它不能直接被实例化,只能被继承。抽象类可以包含属性、方法、以及其他抽象方法的定义。抽象方法只有定义而没有具体实现,需要在具体的子类中实现。


一、抽象类(abstract)的使用

抽象类通过使用关键字 abstract 来定义,而抽象方法通过在方法前加上关键字 abstract 来定义。抽象类和抽象方法用于定义类的行为和结构,并且可以提供一些通用的实现或规范,以供子类继承和实现。

抽象类在面向对象编程中有以下特点:

  1. 不能直接实例化:抽象类不能被直接实例化只能被继承后使用。
  2. 可以包含属性和方法:抽象类中可以定义属性和方法,可以有具体实现的方法和抽象方法。
  3. 可以包含抽象方法:抽象类中可以定义抽象方法,这些方法只有方法的声明而没有具体实现,需要在具体的子类中实现。
  4. 子类必须实现抽象方法:当一个类继承了抽象类时,它必须实现抽象类中的所有抽象方法。

下面是一个使用抽象类的例子:

//抽象类
abstract class Animal {name: string;constructor(name: string) {this.name = name;}//抽象方法  只能有方法的声明而没有具体实现//要实现只能在继承此类之后去实现abstract makeSound(): void;move(distance: number = 0) {console.log(`${this.name} moved ${distance}m`);}
}//Dog 继承 Animal 抽象类
class Dog extends Animal {constructor(name: string) {super(name);}//将Animal 抽象类中的 抽象方法 进行实例化makeSound() {console.log(`${this.name} barks`);}
}let dog = new Dog('Buddy');
dog.makeSound();  // 输出: "Buddy barks"
dog.move(10);    // 输出: "Buddy moved 10m"

在这个例子中,Animal 类是一个抽象类,它有一个抽象方法 makeSound 和一个实现方法 moveDog 类继承了 Animal 类,并实现了 makeSound 方法。

你不能直接实例化抽象类,但可以通过继承抽象类的方式创建实例。在这个例子中,我们创建了一个名为 dogDog 类的实例,并调用了它的 makeSoundmove 方法。

二、抽象类(abstract)的使用场景

TypeScript抽象类的使用场景:

  1. 抽象类可以被用作基类,它提供了一个通用的模板或蓝图,用于派生出其他类。
  2. 抽象类可以定义抽象方法,这些方法在派生类中必须被实现。这样可以确保派生类具有某些特定的功能或行为。
  3. 抽象类可以实现一些通用的功能,而不用在每个派生类中重新实现这些功能。这样可以使代码更加可维护和可扩展。
  4. 抽象类可以用于限制实例化。它们不能直接被实例化,只能被用作继承。
  5. 抽象类可以定义属性和方法,这些属性和方法可以被派生类继承和重写。

总之,抽象类在需要定义一个通用模板或蓝图,并确保派生类具有某些特定功能或行为的情况下非常有用。它们可以提供代码重用、可维护性和可扩展性。

一个常见的应用场景案例是在Web应用开发中使用抽象类来建模和组织组件。

假设我们正在开发一个在线购物应用,其中有多种类型的商品,例如电子产品、服装和食品。我们可以使用抽象类来定义一个通用的商品类,并为每种具体类型的商品创建一个子类。

首先,我们定义一个抽象商品类:

abstract class Product {protected name: string;protected price: number;constructor(name: string, price: number) {this.name = name;this.price = price;}abstract getDescription(): string;
}

然后,我们创建几个具体类型的商品类:

class Electronics extends Product {protected brand: string;constructor(name: string, price: number, brand: string) {super(name, price);this.brand = brand;}getDescription(): string {return `This ${this.brand} ${this.name} costs $${this.price}`;}
}class Clothing extends Product {protected size: string;constructor(name: string, price: number, size: string) {super(name, price);this.size = size;}getDescription(): string {return `This ${this.size} ${this.name} costs $${this.price}`;}
}class Food extends Product {protected expirationDate: string;constructor(name: string, price: number, expirationDate: string) {super(name, price);this.expirationDate = expirationDate;}getDescription(): string {return `This ${this.name} expires on ${this.expirationDate}`;}
}

现在,我们可以使用这些具体类型的商品类创建实例,并调用它们的getDescription方法来获取商品的描述:

const iphone = new Electronics('iPhone', 999, 'Apple');
console.log(iphone.getDescription()); // 输出: This Apple iPhone costs $999const shirt = new Clothing('T-Shirt', 29, 'M');
console.log(shirt.getDescription()); // 输出: This M T-Shirt costs $29const milk = new Food('Milk', 2.99, '2022-01-31');
console.log(milk.getDescription()); // 输出: This Milk expires on 2022-01-31

这个例子中,抽象类Product定义了一个共享的属性和方法,而具体的商品类继承了这些属性和方法,并根据自己的特性实现了getDescription方法。一个常见的应用场景案例是在Web应用开发中使用抽象类来建模和组织组件。

假设我们正在开发一个在线购物应用,其中有多种类型的商品,例如电子产品、服装和食品。我们可以使用抽象类来定义一个通用的商品类,并为每种具体类型的商品创建一个子类。

首先,我们定义一个抽象商品类:

abstract class Product {protected name: string;protected price: number;constructor(name: string, price: number) {this.name = name;this.price = price;}abstract getDescription(): string;
}

然后,我们创建几个具体类型的商品类:

class Electronics extends Product {protected brand: string;constructor(name: string, price: number, brand: string) {super(name, price);this.brand = brand;}getDescription(): string {return `This ${this.brand} ${this.name} costs $${this.price}`;}
}class Clothing extends Product {protected size: string;constructor(name: string, price: number, size: string) {super(name, price);this.size = size;}getDescription(): string {return `This ${this.size} ${this.name} costs $${this.price}`;}
}class Food extends Product {protected expirationDate: string;constructor(name: string, price: number, expirationDate: string) {super(name, price);this.expirationDate = expirationDate;}getDescription(): string {return `This ${this.name} expires on ${this.expirationDate}`;}
}

现在,我们可以使用这些具体类型的商品类创建实例,并调用它们的getDescription方法来获取商品的描述:

const iphone = new Electronics('iPhone', 999, 'Apple');
console.log(iphone.getDescription()); // 输出: This Apple iPhone costs $999const shirt = new Clothing('T-Shirt', 29, 'M');
console.log(shirt.getDescription()); // 输出: This M T-Shirt costs $29const milk = new Food('Milk', 2.99, '2022-01-31');
console.log(milk.getDescription()); // 输出: This Milk expires on 2022-01-31

这个例子中,抽象类Product定义了一个共享的属性和方法,而具体的商品类继承了这些属性和方法,并根据自己的特性实现了getDescription方法。

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

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

相关文章

AI-图片转换绚丽动漫人物-UGATIT

​​​​​​ 🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 ​​​​…

【Databend】多表联结,你不会还没有掌握吧!

文章目录 概述和数据准备内连接交叉连接左连接右连接左反和右反连接全连接总结 概述和数据准备 多表联结是两个或多个表的列合并到一个结果集中。Databend 中支持的连接类型有 inner join 、cross join 、natural join 、left join 、right join 、left anti join 、right ant…

SqlAlchemy使用教程(二) 入门示例及通过CoreAPI访问与操作数据库

二、入门示例与基本编程步骤 在第一章中提到,Sqlalchemy提供了两套方法来访问数据库,由于Sqlalchemy 文档杂乱,对于ORM的使用步骤讲解杂乱,SqlAlchemy2.x 与j1.x版本差异也较大,很多介绍SqlAlchemy的文章上来就讲ORM&…

TS2307: Cannot find module ‘./App.vue‘ or its corresponding type declarations.

目录 1. 问题描述2. 解决方案一:VSCode Volar(官方推荐)3. 解决方案二:WebStorm 2023.2 (官方推荐)4. 解决方案三:禁用严格类型检查选项(不推荐)5. 解决方案四&#xff…

大模型实战营Day5 LMDeploy大模型量化部署实践

模型部署 定义 产品形态 计算设备 大模型特点 内存开销大 动态shape 结构简单 部署挑战 设备存储 推理速度 服务质量 部署方案:技术点 (模型并行 transformer计算和访存优化 低比特量化 Continuous Batch Page Attention)方案(…

rpc的正确打开方式|读懂Go原生net/rpc包

前言 大家好,这里是白泽,之前最近在阅读字节跳动开源RPC框架Kitex的源码,分析了如何借助命令行,由一个IDL文件,生成client和server的脚手架代码,也分析了Kitex的日志组件klog。当然Kitex还有许多其他组件&…

RXJS中Subject, BehaviorSubject, ReplaySubject, AsyncSubject的区别?

在RxJS(Reactive Extensions for JavaScript)中,Subject、BehaviorSubject、ReplaySubject和AsyncSubject都是Observable的变体,它们用于处理观察者模式中的不同场景。以下是它们之间的主要区别: 1、Subject: 是一种特…

在ubuntu平台上安装minecraft

一、获取minecraft启动器安装包 登陆minecraft官网Welcome to the Minecraft Official Site | Minecraft,使用已经购买minecraft的microsoft或者mojang账号登陆。 点击Download Launcher 对于ubuntu系统,使用点击debian版本 此后便会自动下载Minecraft.…

【STM32】FLASH闪存

1 FLASH闪存简介 本节所指STM32内部闪存,即下载程序的时候,程序存储的地方。(非易失性) STM32F1系列的FLASH包含程序存储器、系统存储器(bootloader,不允许修改)和选项字节三个部分&#xff0…

Spring Cloud整体架构解析

Spring Cloud整体架构 本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。 Spring Cloud的中文名我们就…

pytorch学习笔记(八)

Sequential 看看搭建了这个能不能更容易管理,CIFAR-10数据集进行 看一下网络模型CIFAR-10模型 1 2 3 4 5 6 7 8 9 输入进过一次卷积,然后经过一次最大池化&#…

YOLOv7基础 | 手把手教你简化网络结构之yolov7.yaml(包括源码+封装步骤+网络结构图)

前言:Hello大家好,我是小哥谈。通过下载YOLOv7源码可知,原始的yolov7.yaml文件是拆开写的,比较混乱,也不好理解,并且为后续改进增添了很多困难。基于此种情况,笔者就给大家介绍一种将yolov7.yam…

深入理解 Spark(三)SparkTask 执行与 shuffle 详解

SparkTask 的分发部署与启动流程分析 Spark Action 算子触发 job 提交 Spark 当中 Stage 切分源码详解 Task 的提交与执行 SparkShuffle 机制详解 MapReduceShuffle 全流程深度剖析 MapReduce 全流程执行过程中参与工作的组件以及他们的执行先后顺序:InputFormat …

【AIGC】电影风格的一组绝美高清图提示词解析

实际示例 女人主角,以时尚电影风格为灵感,追求照片般的逼真度,运用伦勃朗式光线,创造奇幻且细节丰富的场景,充满象征意义,使用3D渲染技术达到8K超高清晰度。 分类相关信息主角女人风格时尚电影风格逼真度…

LLM漫谈(三)| 使用Chainlit和LangChain构建文档问答的LLM应用程序

一、Chainlit介绍 Chainlit是一个开源Python包,旨在彻底改变构建和共享语言模型(LM)应用程序的方式。Chainlit可以创建用户界面(UI),类似于由OpenAI开发的ChatGPT用户界面,Chainlit可以开发类似…

5 个适用的免费数据恢复软件【2024 年 版本】

互联网上有许多免费的数据恢复软件产品。有些产品是免费软件,而其他产品则提供该工具的免费试用下载以进行评估。我们列出了2024 年 5 款最佳数据恢复工具 ,可以免费下载和试用。 5 个适用的免费数据恢复软件 1.奇客数据恢复(Windows和Mac&am…

Apache-Common-Pool2中对象池的使用方式

最近在工作中,对几个产品的技术落地进行梳理。这个过程中发现一些朋友对如何使用Apache的对象池存在一些误解。所以在写作“业务抽象”专题的空闲时间里,本人觉得有必要做一个关于对象池的知识点和坑点讲解。Apache Common-Pool2 组件最重要的功能&#…

中仕公考:2024年上半年中小学教师资格考试(笔试)报名已开始

2024年上半年中小学教师资格考试(笔试)报名工作于1月12日开始,此次笔试在31个省(自治区、直辖市)举办,各省(自治区、直辖市)的报名公告将陆续上网。 个别地区报名截止时间有所差异,上海1月13日报名截止,浙江、天津、河南1月14日截…

负荷预测 | Python基于CEEMDAN-VMD-BiGRU的短期电力负荷时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 提出一种分解去噪、重构分解的 CEEMDAN-VMD-BiGRU组合预测方法: 1 采用CEEMDAN将原始电力负荷数据分解成一组比较稳定的子序列,联合 小波阈值法将含有噪声的高频分量去噪,保留含有信…

微服务技术要点

一、服务注册到nacos 1.下载nacos,修改nacos启动模式为单机模式,另外需要在环境变量配置JAVA_HOME,否则启动不起来。 2.启动类加注解EnableDiscoveryClient 3.application.yml配置nacos地址 spring:cloud:nacos:discovery:server-addr: 127.0.0.1:884…