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.pswp.cn/web/12866.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12866.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12866.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java面試八股之Java中有哪些原子類,原理是什么

Java中有哪些原子類,原理是什么 AtomicInteger 和 AtomicLong: 用于對整數(int)和長整數(long)進行原子操作。 原理:它們內部封裝了一個整型或長整型變量,并通過使用Unsafe類提供…

HarmonyOS - 記一次HSP異常堆棧無法定位問題

問題背景 HSP混淆打包之后無法定位異常堆棧,問題堆棧為: MyModules/build/default/cache/default/defaultCompileArkTS/esmodule/release/MyModules/src/main/ets/d/r.ts:1:1 問題原因: 導致無法定位問題的原因是,混淆時開啟了代碼…

OpenHarmony 實戰開發——ArkUI容器類API介紹

容器類,顧名思義就是存儲的類,用于存儲各種數據類型的元素,并具備一系列處理數據元素的方法。在 ArkUI 開發框架中,容器類采用了類似靜態的語言來實現,并通過 NAPI 框架對外提供。通過對存儲位置以及屬性的限制&#x…

關于數據結構B+TREE 和 HASH的整理

一、BTREE BTree是一種樹數據結構,是B-Tree的變種,屬于n叉排序樹,每個節點通常有多個孩子。 BTree是和B-Tree相比,BTree的所有的數據都會出現在葉子節點上,并且葉子節點會形成一個單向鏈表,非葉子節點僅僅…

C++map容器關聯式容器

Cmap 1. 關聯式容器 vector、list、deque、forward_list(C11)等STL容器,其底層為線性序列的數據結構,里面存儲的是元素本身,這樣的容器被統稱為序列式容器。而map、set是一種關聯式容器,關聯式容器也是用來存儲數據的&#xff0…

日期問題,

日期問題 ac代碼 #include <cstdio> #include <iostream>using namespace std;int days[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};bool check_valid(int year, int month, int day) {if (month 0 || month > 12) return false;if (day 0) …

【開發】模型部署筆記

目錄 模型量化 模型量化 1、模型量化優點 低精度模型表示模型權重數值格式為FP16&#xff08;半精度浮點&#xff09;或者INT8&#xff08;8位定點整數&#xff09;&#xff0c;但是目前低精度往往就指代INT8。常規精度模型則一般表示模型權重數值格式為FP32&#xff08;32位…

求數組最大值

#include <bits/stdc.h> using namespace std; int main(){int a[4]{1,2,3,4};cout<<*max_element(a,a4);return 0; }

策略模式詳解

策略模式 1 概述 先看下面的圖片&#xff0c;我們去旅游選擇出行模式有很多種&#xff0c;可以騎自行車、可以坐汽車、可以坐火車、可以坐飛機。 作為一個程序猿&#xff0c;開發需要選擇一款開發工具&#xff0c;當然可以進行代碼開發的工具有很多&#xff0c;可以選擇Idea進…

JavaScript的跳轉傳參方式

在JavaScript中&#xff0c;頁面跳轉并傳遞參數通常可以通過幾種不同的方式來實現。下面是一些常見的方法&#xff1a; 1.URL參數&#xff08;Query String&#xff09; 這是最常見的方式&#xff0c;通過在URL的末尾添加參數來實現。例如&#xff1a; javascriptwindow.loc…

gitlab webhook觸發jenkins任務

配置jenkins 安裝gitlab插件 配置jenkins job 選擇gitlab webhook觸發 在高級中生成token 代碼倉設置 新增webhook 配置webhook 測試連接 缺點&#xff0c;不能帶gitLab事件的參數&#xff01;&#xff01;&#xff01;

Spark RDD案例:統計網站每月訪問量

這個項目利用Spark技術&#xff0c;通過統計網站訪問記錄中的日期信息&#xff0c;實現了對每月訪問量的統計和排序。通過分析數據&#xff0c;我們可以了解到不同月份的網站訪問情況&#xff0c;為進一步優化網站內容和推廣策略提供數據支持。 使用Spark統計網站每月訪問量 …

Apache2.4和PHP8的量子糾纏

Apache不建議你用&#xff0c;PHP建議使用

一種基于電場連續性的高壓MOSFET緊湊模型,用于精確表征電容特性

來源&#xff1a;A Compact Model of High-Voltage MOSFET Based on Electric Field Continuity for Accurate Characterization of Capacitance&#xff08;TED 24年&#xff09; 摘要 本文提出了一種新的高壓MOSFET&#xff08;HV MOS&#xff09;緊湊模型&#xff0c;以消…

P5732 楊輝三角

題目描述 給出 &#x1d45b;(&#x1d45b;≤20)n(n≤20)&#xff0c;輸出楊輝三角的前 &#x1d45b;n 行。 如果你不知道什么是楊輝三角&#xff0c;可以觀察樣例找找規律。 輸入格式 無 輸出格式 無 輸入輸出樣例 輸入 #1復制 6 輸出 #1復制 1 1 1 1 2 1 1 3 3 …

408學習筆記-數據結構-2-線性表

線性表 1、邏輯結構 1、數據結構只有一種邏輯結構&#xff0c;而可以有兩種存儲結構&#xff0c;有多種抽象運算。 2、線性表是一種邏輯結構&#xff0c;屬于總線性結構——線性結構的一種&#xff0c;同屬于線性結構的邏輯結構還有&#xff1a;棧、隊列和數組。 3、線性表定…

【經典文獻】水下光學和聲學成像:融合的時代?最新技術概述

文獻名稱&#xff1a;《Underwater Optical and Acoustic Imaging: A Time for Fusion? A Brief Overview of the State-of-the-Art》作者列表&#xff1a;Fausto Ferreira, Diogo Machado, Gabriele Ferri, Samantha Dugelay and John Potter作者單位&#xff1a;北約科學技術…

【hana】hana1.0多容器常用命令

基礎命令 數據庫 連接數據庫 hdbsql -u system -p {passwd} -i 02 -d {dbname}查詢所有數據庫 SELECT DATABASE_NAME, ACTIVE_STATUS FROM M_DATABASES;停止數據庫&#xff0c;會修改數據庫狀態為No ALTER SYSTEM STOP DATABASE testdb; 啟動數據庫&#xff0c;會修改數據…

多線程的代碼案例

目錄 單例模式 餓漢模式 懶漢模式 阻塞隊列 生產者消費者模型意義: 阻塞隊列使用方法 實現阻塞隊列 阻塞隊列實現生產者消費者模型 定時器 實現簡單的定時器 工廠模式 線程池 為啥呢? 從池子里面取 比 創建線程 效率更高 線程池的創建 怎么填坑 ThreadPoolExec…