当前位置: 首页 > news >正文

TS-抽象类和静态成员

目录

  • 1,抽象类
    • 1,为什么需要抽象类
    • 2,抽象成员
    • 3,设计模式-模板模式
  • 2,静态成员
    • 1,什么是静态成员
    • 2,设计模式-单例模式

1,抽象类

1,为什么需要抽象类

有时,某个类只表示一个抽象的概念,主要用于提取子类的公共成员,而不是直接创建它的实例对象。此时,这个类可以作为抽象类。

实现:在类名前加 abstract,抽象类不可以通过 new 来创建实例对象。

2,抽象成员

有时,一些公共成员是必须存在的,但还不确定成员的值或具体实现。因为,需要一种强约束,让继承的子类必须实现这些成员。

也就是说,抽象类中定义的抽象成员,在子类中必须实现。

如果子类也是抽象类,则可以不实现父类中的抽象成员或方法。

子类的3种实现方式:

abstract class Chess {abstract readonly name: string;
}// 第1种
class Horse extends Chess {readonly name: string = "马";
}// 第2种
class Pao extends Chess {readonly name: string;constructor() {super();this.name = "炮";}
}// 第3种
class Soldier extends Chess {get name() {return "兵";}
}

3,设计模式-模板模式

当某个公共方法中,一部分是公共逻辑,一部分又是私有逻辑(需要再子类中实现)。

此时,可以不将该方法定义为抽象方法,而是将那部分私有逻辑定义为抽象方法,并在当前方法中调用即可。

这样的强约束,可以只关注子类需要实现的东西,其他的父类已经完成。

abstract class Chess {abstract readonly name: string;move(targetX: number, targetY: number): boolean {// 第1和第2步属于公共逻辑// 1,边界条件判断// 2,目标位置是否有己方棋子// 第3步属于私有逻辑:不同兵种的移动规则(需要在子类中实现)if (this.rule(targetX, targetY)) {console.log("移动成功");return true;} else {return false;}}protected abstract rule(targetX: number, targetY: number): boolean;
}class Horse extends Chess {protected rule(targetX: number, targetY: number): boolean {return true; // 简单实现,做测试使用。}readonly name: string = "马";
}const horse = new Horse();
horse.move(2, 3);

2,静态成员

1,什么是静态成员

指附着在类上的成员(相当于构造函数的属性),通过static修饰。

每个实例成员的相同属性,理论上是不一样的,所以那些相同的属性应该作为静态成员,附着在类上。

构造函数或非静态方法中的this指向实例对象,如果要访问当前类,直接使用类名即可。

静态方法中的this指向当前类。

class User {static users: User[] = [];constructor(public id: string, public pwd: string, public name: string, public age: number) {User.users.push(this);}static login(loginId: string, loginPwd: string): User | undefined {// 静态方法中 this 指向当前类return this.users.find((user) => user.id === loginId && user.pwd === loginPwd);}sayHello() {console.log(`我是${this.name}`);}
}new User("u1", "pwd1", "用户1", 18);
new User("u2", "pwd2", "用户2", 188);console.log(User.users);const user = User.login("u1", "pwd1");
if (user) {user.sayHello();
}

2,设计模式-单例模式

某些类的实例对象,在系统中只允许存在一个,为了避免开发者随意创建实例对象而产生预期之外的错误,可以使用单例模式进行强约束。

构造函数私有化或抽象类,都不允许 new 实例对象。

class User {private constructor() {}private static _user?: User;static createUser() {if (!this._user) {this._user = new User();}return this._user;}
}const u1 = User.createUser();
const u2 = User.createUser();
console.log(u1 === u2);

下面的方式也可以创建单例,但有一些缺陷。

  • 实例对象一开始就创建了,不是在需要时才创建。
  • 做不到在创建单例对象时,提前执行一些代码。
class User {private constructor() {}static readonly singleUser = new User()
}const u1 = User.singleUser;
const u2 = User.singleUser;
console.log(u1 === u2);

以上。

相关文章:

TS-抽象类和静态成员

目录 1,抽象类1,为什么需要抽象类2,抽象成员3,设计模式-模板模式 2,静态成员1,什么是静态成员2,设计模式-单例模式 1,抽象类 1,为什么需要抽象类 有时,某个…...

SharePoint 使用renderListDataAsStream方法查询list超过5000时的数据

问题: 当SharePoint List里的数据超过5000时,如果使用常用的rest api去获取数据,例如 await this.sp.web.lists.getByTitle(Document Library).rootFolder.files.select(*, listItemAllFields).expand(listItemAllFields).filter(listItemA…...

2024042001-计算机网络 - 物理层

计算机网络 - 物理层 计算机网络 - 物理层 通信方式带通调制 通信方式 根据信息在传输线上的传送方向,分为以下三种通信方式: 单工通信:单向传输半双工通信:双向交替传输全双工通信:双向同时传输 带通调制 模拟信号…...

通过java将数据导出为PDF,包扣合并单元格操作

最近项目中需要将查询出来的表格数据以PDF形式导出&#xff0c;并且表格的形式包含横向行与纵向列的单元格合并操作&#xff0c;导出的最终效果如图所示&#xff1a; 首先引入操作依赖 <!--导出pdf所需包--><dependency><groupId>com.itextpdf</groupId&…...

Java内存模式以及volatile关键字的使用

1.Java内存模型 &#xff08;1&#xff09;Java 内存模型&#xff08;Java Memory Model&#xff0c;简称 JMM&#xff09;&#xff0c;它是一个抽象的概念&#xff0c;JMM是和多线程相关的&#xff0c;它是一组规范&#xff0c;描述了一组规则&#xff0c;定义了多线程对共享…...

每日5题Day3 - LeetCode 11 - 15

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxArea(int[] height) {//这道题比较特殊&#xff0c;因为两边是任意…...

路由器、交换机和网卡

大家使用VMware安装镜像之后&#xff0c;是不是都会考虑虚拟机的镜像系统怎么连上网的&#xff0c;它的连接方式是什么&#xff0c;它ip是什么&#xff1f; 路由器、交换机和网卡 1.路由器 一般有几个功能&#xff0c;第一个是网关、第二个是扩展有线网络端口、第三个是WiFi功…...

腾讯开源混元DiT文生图模型,消费级单卡可推理

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…...

shell脚本基础(if/else结构)

命令是双向选择语句&#xff0c;当用户执行脚本时如果不满足if后的表达式也会执行else后的命令&#xff0c;所以有很好的交互性。其结构为&#xff1a; if expression1 then command … command else command … command fi vim ifelse_exam.sh #ifelse_exam.sh #!/bin/bashec…...

万字长文破解 AI 图片生成算法-Stable diffusion (第一篇)

想象一下&#xff1a;你闭上眼睛&#xff0c;脑海中构思一个场景&#xff0c;用简短的语言描述出来&#xff0c;然后“啪”的一声&#xff0c;一张栩栩如生的图片就出现在你眼前。这不再是科幻小说里才有的情节&#xff0c;而是Stable Diffusion——一种前沿的AI图片生成算法—…...

Linux---编辑器vim的认识与简单配置

前言 我们在自己的电脑上所用的编译软件&#xff0c;就拿vs2022来说&#xff0c;我们可以在上面写C/C语言、python、甚至java也可以在上面进行编译&#xff0c;这种既可以用来编辑、运行编译&#xff0c;又可以支持很多种语言的编译器是一种集成式开发环境&#xff0c;集众多于…...

lucene中Collector类、CollectorManager类区分和用法

我的lucene版本是9.10.0&#xff0c;请说明Collector类、CollectorManager类区分和用法&#xff0c;尽量详细点 在 Lucene 9.10.0 中&#xff0c;Collector 类和 CollectorManager 类都是用于搜索结果的收集和处理 Collector 类 Collector 类是一个接口&#xff0c;用于收集…...

Android之给Button上添加按压效果

一、配置stateListAnimator参数实现按压效果 1、按钮控件 <Buttonandroid:id"id/mBtnLogin"android:layout_width"match_parent"android:layout_height"48dp"android:background"drawable/shape_jfrb_login_button"android:state…...

python EEL + vue3.js 项目中如何把组件中的函数提升为全局函数

eel官方示例中暴露的js函数是全局函数&#xff0c;vue中的自定义函数作用域通常都是组件范围内。要让eel.js调用&#xff0c;需要将其升为全局可用。 一般方法有 app.config.globalProperties 或 mixin等。 main.js //main.jsimport { createApp } from vue import App from…...

sqli-labs靶场第十四关

目录 1&#xff1a;分析 找闭合符&#xff1a; 2&#xff1a;开始注入 报错注入&#xff1a; 注入数据库名&#xff1a; 注入表名&#xff1a; 注入列名&#xff1a; 注入具体值&#xff1a; 1&#xff1a;分析 经过我们的实验发现当我们输入的密码后面存在双引号时会报…...

【C语言】6.C语言VS实用调试技巧(1)

文章目录 1.什么是 bug2.什么是调试&#xff08;debug&#xff09;&#xff1f;3.Debug 和 Release4.VS调试快捷键4.1 环境准备4.2 调试快捷键 5.监视和内存观察5.1 监视5.2 内存 1.什么是 bug bug现在一般是指在电脑系统或程序中&#xff0c;隐藏着的一些未被发现的缺陷或问题…...

AIGC行业现在适合进入吗

人工智能、物联网、基因编辑和量子计算等新兴技术领域正在以前所未有的速度发展&#xff0c;这些技术的结合正在重塑我们的世界。在这个充满机遇和挑战的时代&#xff0c;AIGC&#xff08;人工智能、基因编辑和量子计算&#xff09;行业备受关注&#xff0c;许多人都在考虑是否…...

ubuntu CUDA 驱动更新,版本更新,多CUDA版本管理

1 新版本驱动下载 前面介绍过window CUDA驱动更新&#xff0c;但是对于ubuntu 的驱动更新&#xff0c;没有一键操作。 本人笔记本电脑n年前装的CUDA DRIVER仅支持到cuda10.2&#xff0c;实在无法满足这日新月异的科技更新。 左 旧的驱动版本 右 新下载的硬件支持的驱动版本&…...

effective python学习笔记_类与接口

用组合类实现多层结构而不用内置类型 例子&#xff1a;成绩单&#xff0c;存储学生各科成绩多个然后加权重&#xff0c;如果用字典类型会导致字典有多层嵌套结构 思想 当用内置类型如字典元组等结构出现超过二层的多层嵌套结构时&#xff0c;读起来会比较难懂&#xff0c;此时…...

如何去除字符串两侧的空白字符?

TRIM函数会去掉字符串左侧和右侧的空格&#xff0c;语法是&#xff1a;TRIM(字符串) excel中&#xff0c;TRIM函数能去掉字符串左侧和右侧的空格&#xff0c;它的ASCII码是32。 以下设定一个字符串组合&#xff0c;它的第一个字符中空格&#xff0c;最后一个字符是换行符 &q…...

如何永久免费使用IDM下载管理器:无需破解的智能重置方案

如何永久免费使用IDM下载管理器&#xff1a;无需破解的智能重置方案 【免费下载链接】idm-trial-reset Use IDM forever without cracking 项目地址: https://gitcode.com/gh_mirrors/id/idm-trial-reset 想要永久免费使用Internet Download Manager这款强大的下载加速工…...

数据结构第8章查找:单元测试15题全解析(顺序查找+折半查找+分块查找+哈希查找)

第8章 查找 单元测试1. 线性表只有以&#xff08; A &#xff09;方式存储&#xff0c;才能进行折半查找。A. 顺序B. 链接C. 二叉树D. 关键字有序的2. 有序表为{2&#xff0c;4&#xff0c;10&#xff0c;13&#xff0c;33&#xff0c;42&#xff0c;46&#xff0c;64&#x…...

从外卖配送范围到跨国航线规划:Geopy距离计算的3个实战场景与避坑经验

从外卖配送范围到跨国航线规划&#xff1a;Geopy距离计算的3个实战场景与避坑经验 在数字化浪潮席卷各行各业的今天&#xff0c;地理距离计算已成为许多商业应用的核心技术组件。无论是外卖小哥的手机App上闪烁的配送范围提示&#xff0c;还是国际物流系统中精确到米的航线规划…...

【麒麟系统-解释器错误:权限不足】

执行脚本后发现无法执行权限不足查看发现当前是有执行权限的&#xff1b;最后发现可能是有安全限制&#xff1a; 执行命令getstatus 执行这个命令即可&#xff1a;sudo setstatus softmode...

日本租房成本核算沙盘

最近忙着租房子&#xff0c;日本租房不同于国内&#xff0c;有非常多杂乱的费用&#xff0c;这些都是必须在租房子的时候就考虑在内的&#xff0c;所以我制作了这个网站&#xff0c;希望能帮助到各位小伙伴。 目前已经部署在了服务器上&#xff0c;网址如下 http://8.130.68.…...

植物树枝叶片果实检测数据集7220张VOC+YOLO格式

植物树枝叶片果实检测数据集7220张VOCYOLO格式数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7220 标注数量(xml文件个数)&#xff1a;7220…...

NotebookLM概念关联分析全链路解析,从原始文本到可验证知识网络的6大断点与修复方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM概念关联分析全链路解析概览 NotebookLM 是 Google 推出的基于 LLM 的实验性研究辅助工具&#xff0c;其核心能力在于对用户上传的文档&#xff08;PDF、TXT、网页等&#xff09;进行语义理…...

办公Agent从0到1落地指南,5个步骤 + 6个避坑

大家好&#xff0c;我是小悟。 一、核心逻辑&#xff1a;Agent不是“对话机器人”&#xff0c;而是“数字执行者” 很多团队误以为采购了某个AI助手&#xff08;如会议纪要工具、代码生成插件&#xff09;就是引进了Agent。真正的办公Agent具备“感知-决策-执行”闭环&#xff…...

【免费下载】 AD7124中文手册(非常完整)

AD7124中文手册&#xff08;非常完整&#xff09; 【下载地址】AD7124中文手册非常完整 AD7124-8是一款高性能模拟前端&#xff0c;设计用于在各种苛刻环境中实现精确的数据采集。这款芯片的特点在于其内置的高精度24位Σ-Δ模数转换器(ADC)&#xff0c;能够灵活配置以支持8个差…...

三极管的削波失真是什么

削波失真&#xff08;Clipping Distortion&#xff09;是指当放大电路&#xff08;如三极管、运放&#xff09;的输出信号幅度超过了其供电电压或输出动态范围的极限时&#xff0c;信号的顶部和/或底部被“削平”而发生的失真现象。1. 它是如何发生的&#xff1f;以一个共射放大…...