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);

以上。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++中的右值引用和移动语义

目录 1 左值引用和右值引用 2 左值引用与右值引用比较 3 右值引用使用场景和意义 4 右值引用引用左值及其一些更深入的使用场景分析 5 完美转发 6.常数右边引用 1 左值引用和右值引用 传统的C语法中就有引用的语法,而C11中新增了的右值引用语法特性&#xff0c…

数组中两个字符串的最小距离

给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。 输入描述: 输入包含有多行,第一输入一个整数n(1 ≤ n ≤…

Python | Leetcode Python题解之第61题旋转链表

题目: 题解: class Solution:def rotateRight(self, head: ListNode, k: int) -> ListNode:if k 0 or not head or not head.next:return headn 1cur headwhile cur.next:cur cur.nextn 1if (add : n - k % n) n:return headcur.next headwhi…

【Redis7】了解Redis

1.常见数据库 1.1.键值存储数据库 如 Map 一样的key-value 对,典型代表就是 Redis。 1.2.列存储数据库 关系型数据库是典型的行存储数据库,按行存储的数据在物理层面占用的是连续存储空间,不适合海量数据存储。而按列存储则可实现分布式存储&…

第七届机电、机器人与自动化国际会议(ICMRA 2024)即将召开!

第七届机电、机器人与自动化国际会议(ICMRA 2024)将于2024年9月20日-22日在中国武汉举行。ICMRA 2024为各国专家学者提供一个学术交流的平台,讨论机电、机器人和自动化领域的最新研究成果和未来的研究方向,旨在能够建立起国家间&a…

C语言常见的动态内存错误及几个经典笔试题以及c/c++内存开辟空间等的介绍

文章目录 前言一、常见的动态内存错误1. 对NULL指针的解引用操作2. 对动态开辟空间的越界访问3. 对非动态开辟内存使用free()4. 使用free释放一块动态开辟内存的一部分5. 对同一块动态内存多次释放6. 动态开辟内存忘记释放(内存泄漏) 二、几个经典笔试题…

三层交换机与防火墙连通上网实验

防火墙是一种网络安全设备,用于监控和控制网络流量。它可以帮助防止未经授权的访问,保护网络免受攻击和恶意软件感染。防火墙可以根据预定义的规则过滤流量,例如允许或阻止特定IP地址或端口的流量。它也可以检测和阻止恶意软件、病毒和其他威…

element-ui table sortable排序 掉后端接口方式

实例: 官方解释:如果需要后端排序,需将sortable设置为custom,同时在 Table 上监听sort-change事件,在事件回调中可以获取当前排序的字段名和排序顺序,从而向接口请求排序后的表格数据。 1.table上要加 sort-change"sortCha…

XTuner微调LLM:1.8B、多模态和Agent

XTuner微调大语言模型,我们的介绍主要分为以下六个方面。 首先我们讲一下Finetune:分为两种Finetune范式和一条数据的一生来讲解。 为什么要微调?我们的大语言模型为基座模型,要应用到某种特定的场景,需要微调做相应适…

STC8增强型单片机开发——C51版本Keil环境搭建

一、目标 了解C51版本Keil开发环境的概念和用途掌握C51版本Keil环境的安装和配置方法熟悉C51版本Keil开发环境的使用 二、准备工作 Windows 操作系统Keil C51 安装包(可以从Keil官网下载)一款8051单片机开发板 三、搭建流程 环境搭建的基本流程&#xf…

做外贸用什么邮箱比较好?

外贸公司在推进公司业务时需要频繁进行跨国沟通,选择一款专业且功能强大的企业邮箱作为业务沟通工具至关重要。外贸企业邮箱需要满足5个基本内容,国际收发能力、安全稳定性、专业形象展示、功能完备性、客户服务与技术支持。本文将探讨做外贸时适合使用的…

C++语法|如何写出高效的C++代码(一)|对象使用过程中背后调用了哪些方法(构造和析构过程)?

文章目录 再探拷贝构造函数和重载复制运算符实例化新对象和赋值操作强转为类类型指针和引用时临时对象的构造和析构过程 考考你问题答案 再探拷贝构造函数和重载复制运算符 实例化新对象和赋值操作 首先我们写一个类,实现它的拷贝构造并重载赋值运算符。 class T…

封装Springboot基础框架功能-03

在些模块中汇总了一些web开发常用的配置和功能。 模块源码结构 Restful API常用定义 QueryParam请求参数 Data public class QueryParam {private String key;private String value; }RestfulController实现 RestfulController.java,主要汇总一些常用的restful的…

【C++】C++11--- 列表初始化|关键字

目录 前言 列表初始化 创建对象时的列表初始化 单参数隐式类型转换 多参数的隐式类型转换 new表达式中使用列表初始化 列表初始化适用于STL 容器 模板类initializer_list 关键字auto 关键字decltype 关键字nullptr 前言 C标准10年磨一剑,第二个真正意义上…

探索网站支付系统的奥秘,从Vue3和Spring Boot开始(入门级项目实战+在线教程)附赠项目源码!

你是否曾经在购物时,对着电脑屏幕前的“支付成功”四个字感到好奇?这背后的秘密究竟是什么? 今天,让我们一起揭开支付系统的神秘面纱,探索其背后的技术实现。 在这个基于Vue3和Spring Boot的支付项目实战中&#xff…

ChatGLM-Math:强化数学能力

大型语言模型(LLM)在文本摘要、问答和角色扮演对话等语言任务上表现出色,在数学推理等复杂问题上也具有应用潜力。 但目前提高 LLM 数学问题解决能力的方法,往往会导致其他方面能力的下降。例如RLHF的方法,虽然可以提…

Linux的虚拟机操作

一、linux系统 我们知道的系统用到的大多数是Windows系统。 Windows个人用到的有:win7 win10 win11 winxp 服务器用到的有:windows server 2003、2008、2013...........等等 linux也有系统。 centos 7 有5、6、8等等 redhat ubuntu kail 二、了…

Apple强大功能:在新款 iPad Pro 和 iPad Air 中释放 M4 芯片潜力

Apple 的最新强大功能:在新款 iPad Pro 和 iPad Air 中释放 M4 芯片的潜力 概述 Apple 推出配备强大 M4 芯片的最新 iPad Pro 和 iPad Air 型号,再次突破创新界限。新一代 iPad 有望彻底改变我们的工作、创造和娱乐方式。凭借无与伦比的处理能力、令人惊…

kubebuilder(6)webhook

operator中的webhook也是很重要的一块功能。也是相对比较独立的模块,所以放在后面讲。 webhook是一个callback,注册到k8s的api-server上。当某个特定的时间发生时,api server就会查询注册的webhook,并根据一些逻辑确认转发消息给…

练习题(2024/5/8)

1 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(…