30、類和接口

文章目錄

    • 接口概念
    • 接口和類之間有何關系? 可以使用接口來約束類
    • 接口繼承接口
    • 接口還可以繼承類
      • 接口為什么可以繼承類
        • 內層原因:接口為什么可以繼承類
      • 用得出的結論解釋最初的demo
      • 接口繼承類的一些限制

接口概念

接口(Interfaces)可以用于對「對象的形狀(Shape)」進行描述

interface Box {height: number;color: string;[propName: string]: number | string
}let box1: Box = {height: 888,color: '#f60',weight: '999'
}

接口和類之間有何關系? 可以使用接口來約束類

實現(implements)是面向對象中的一個重要概念

一般來講,一個類只能繼承自另一個類,有時候不同類之間可以有一些共有的特性,這時候就可以把特性提取成接口(interfaces),用 implements 關鍵字來實現。這個特性大大提高了面向對象的靈活性

舉例來說: 門是一個類,防盜門是門的子類。如果防盜門有一個報警器的功能,我們可以簡單的給防盜門添加一個報警方法。這時候如果有另一個類,車,也有報警器的功能,就可以考慮把報警器提取出來,作為一個接口,防盜門和車都去實現它

interface Alarm {alert(): void;
}
class Door {}
class SecurityDoor extends Door implements Alarm {alert(): void {console.log('SecurityDoor alert')}
}class Car implements Alarm {alert(): void {console.log('Car alert')}
}

一個類還可以實現多個接口

interface Alarm {alert(): void;
}
interface Light {lightOn(): void;lightOff(): void;
}class Vehicle implements Alarm, Light {alert(): void {console.log('Vehicle alert')}lightOn(): void {console.log('車燈開')   }lightOff(): void {console.log('車燈關')}
}
// Vehicle 實現了 Alarm、Light接口,既能報警又可以開關燈

接口繼承接口

接口和接口之間可以是繼承關系

interface Alarm {alert(): void;
}
interface LightableAlarm extends Alarm {sayHi(): void;sayNo(): void;
}let kf: LightableAlarm = {sayHi():void {},sayNo():void {}
}

在這里插入圖片描述

這樣才正確,LightableAlarm 繼承了Alarm ,就要有Alarm 接口定義的方法

interface Alarm {alert(): void;
}
interface LightableAlarm extends Alarm {sayHi(): void;sayNo(): void;
}
let kf: LightableAlarm = {sayHi():void {},sayNo():void {},alert(): void {}
}

接口還可以繼承類

常見的面向對象的語言中,接口是不能繼承類的,但是在ts中是可以的

class Point {x: number;y: number;constructor(x: number, y: number) {this.x = xthis.y = y}
}
interface Point3d extends Point {z: number
}
let point3d: Point3d = {x: 1, y: 2, z: 3};

接口為什么可以繼承類

一個類可以當做類來用,也可以當做一個類型來用

class Point {x: number;y: number;constructor(x: number, y: number) {this.x = xthis.y = y}
}// demo: Point 可以當做類來用,也可以當做類型來用// 當做類來用
let p = new Point(1,2)// 當做類型來用
function printPoint(p: Point) {console.log(p)
} 
printPoint(new Point(1,2)) 
內層原因:接口為什么可以繼承類
class Point {x: number;y: number;constructor(x: number, y: number) {this.x = xthis.y = y}
}
interface PointInstanceType {x: number;y: number
}function printPoint1(p: PointInstanceType) {console.log(p)
}
printPoint1(new Point(1,2))
// 上例中我們新聲明的 PointInstanceType 類型,與聲明 class Point 時創建的 Point 類型是等價的

用得出的結論解釋最初的demo

當我們聲明 interface Point3d extends Point 時,Point3d 繼承的實際上是類 Point 的實例的類型

換句話說,可以理解為定義了一個接口:PointInstance,Point3d 繼承另一個接口 PointInstance

所以「接口繼承類」和「接口繼承接口」沒有什么本質的區別。

class Point {x: number;y: number;constructor(x: number, y: number) {this.x = xthis.y = y}
}
// TODO:
// interface PointInstance {
//   x: number
//   y: number
// }
// interface Point3d extends Point   等價于interface Point3d extends PointInstance
interface Point3d extends Point {z: number
}
let point3d: Point3d = {x: 1, y: 2, z: 3};

接口繼承類的一些限制

如上例,可以看出PointInstance 相比Point ,缺少了constructor方法 ,這是因為聲明 Point 類時創建的 Point 類型是不包含構造函數的。另外,除了構造函數是不包含的,靜態屬性或靜態方法也是不包含的(實例的類型當然不應該包括構造函數、靜態屬性或靜態方法)

換句話說聲明 Point 類時創建的 Point 類型只包含其中的實例屬性和實例方法;
同樣的 在接口繼承類的時候,也只會繼承它的實例屬性和實例方法

class Point {/** 靜態屬性,坐標系原點 */static origin = new Point(0, 0);/** 靜態方法,計算與原點距離 */static distanceToOrigin(p: Point) {return Math.sqrt(p.x * p.x + p.y * p.y);}/** 實例屬性,x 軸的值 */x: number;/** 實例屬性,y 軸的值 */y: number;/** 構造函數 */constructor(x: number, y: number) {this.x = x;this.y = y;}/** 實例方法,打印此點 */printPoint() {console.log(this.x, this.y);}
}interface PointInstanceType {x: number;y: number;printPoint(): void;
}let p1: Point;
let p2: PointInstanceType;

上例中最后的類型 Point 和類型 PointInstanceType 是等價的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719392.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719392.shtml

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

相關文章

【大廠AI課學習筆記NO.61】環境部署的選擇

主要是選擇單機和分布式、生產和開發環境的規劃等。 開發環境、測試環境、預發布環境和生產環境是軟件開發和部署過程中常見的幾個環境,它們各自的定義、區別、聯系以及實現的關鍵技術如下: 1. 開發環境(Development Environment&#xff09…

Ai 快捷鍵學習

Ai 快捷鍵學習 Ait 鼠標滾輪 實現頁面的放大和縮小 空格鼠標左鍵 抓手工具 ctrl r 調出標尺,可以通過標尺來對其圖片 ctrl ; 隱藏標尺 ctrl ‘ 調用網格標尺 再按一次就是取削 ctrl shiftz 反向撤回 tab 快速全屏 ctsls / ctrlshift…

完全解析淘寶天貓詳情接口API:購物小白也能秒變高手

在如今的電商領域中,淘寶和天貓是最為重要和熱門的平臺之一。作為購物平臺的用戶,我們通常只是瀏覽商品的頁面,點擊購買和支付,卻未能深入了解背后的技術信息。然而,淘寶天貓詳情接口API的了解和運用,聯訊數…

力扣hot4--雙指針

題目: 雙指針想法: i 指針在數組不為 0 的地方停留,j 指針在每個地方停留,依次交換 i 和 j 指針。當 i 指針遍歷完所有數組元素時,j 指針指向的元素及后面的元素都為0。 代碼如下: C版本 class Solution …

冒泡、插入、希爾、選擇、堆排序、快速排序(附源碼)

目錄 插入排序: 核心思想: 時間復雜度: 冒泡排序: 核心思想: 時間復雜度: 希爾排序: 核心思想: 時間復雜度: 選擇排序: 核心思想: 時間…

告別手動填寫邀請碼,這款App數據統計工具幫你輕松實現

在移動互聯網時代,App的推廣和運營已成為各大企業的必修課。然而,面對錯綜復雜的推廣渠道和浩如煙海的數據,如何精準地追蹤用戶來源、優化推廣策略,一直是困擾著運營者的難題。今天,我們就來聊聊一款能夠幫助你輕松解決…

[C++核心編程](七):類和對象——運算符重載*

目錄 四則運算符重載 左移運算符重載 遞增運算符重載 賦值運算符重載 關系運算符重載 函數調用運算符重載 對已有的運算符重新進行定義,賦予其另一種功能,以適應不同的數據類型 四則運算符重載 對自定義數據類型實現四則運算(加減乘除&…

新火種AI|AI商業中的里程碑事件已敲定! 歐盟27國一致通過《人工智能法案》。

作者:小巖 編輯:彩云 根據路透社2月2日消息,歐盟國家就《人工智能法案》立法正式達成協議。 此次立法的成功堪稱AI商業領域上的里程碑事件。因為單從商業視角來看,這一法案的通過率先為歐盟內部的人工智能創新提供了明確的法律…

在 Linux 上用 zram 替代傳統交換空間 | Linux 中國

我在我的電腦上花了很多時間(我是說工作),我發現了很多有趣的東西。其中最近引起我注意的是 zram0 設備。我是在幾個月前寫一篇文章時第一次注意到它,它顯示在 lsblk 命令的輸出中: # lsblk NAME MAJ:MIN RM…

【VPX637】基于XCKU115 FPGA+ZU15EG MPSOC的6U VPX雙FMC接口通用信號處理平臺

VPX637是一款基于6U VPX總線架構的通用實時信號處理平臺,該平臺采用一片Xilinx的高性能Kintex UltraScale系列FPGA(XCKU115-2FLVF1924I)作為預處理單元,外掛2個FMC擴展接口,來完成數據采集、數據回放以及實時信號處理算…

[動態規劃,DFS深度搜索]滑雪

滑雪 題目描述 Michael喜歡滑雪,這并不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道在一個區域中的最長底滑坡。區域…

Java---文件,流???

文章目錄 1.遍歷文件夾2.遍歷子文件夾3.練習流4.以字節流的形式讀取文件內容5.以字節流的形式向文件寫入數據頂折糾問6 .寫入數據到文件 1.遍歷文件夾 一般說來操作系統都會安裝在C盤,所以會有一個 C:\WINDOWS目錄。 遍歷這個目錄下所有的文件(不用遍歷子目錄) 找出…

ssh連接ubantu失敗

新系統Ubuntu20.4 安裝ssh server 1. 安裝 openssh-server2. 開啟22號端口 # 安裝ssh服務 sudo apt-get install openssh-server # 安裝防火墻 sudo apt-get install ufw # 開啟防火墻 sudo ufw enable #放開22端口 sudo ufw allow 22 開啟22號端口 倘若ubuntu沒有開啟22…

HTTP/2、HTTP/3分別解決了什么問題

總的來說就是HTTP/1.1是請求-響應模型導致隊頭阻塞問題,HTTP2是TCP層面導致隊頭阻塞問題 HTTP/2 多路復用,解決了HTTP/1.1隊頭阻塞問題 HTTP/1.1 的實現是基于請求-響應模型的。同一個連接中,HTTP 完成一個事務(請求與響應&…

3.4作業

課上代碼復習&#xff1a; 廣播接收端代碼: #include<myhead.h> int main(int argc, const char *argv[]) {//創建套接字int rfd socket(AF_INET,SOCK_DGRAM,0);if(rfd -1){perror("socket error");return -1;}printf("rfd %d\n",rfd);//填充地…

臺式電腦電源各線的電壓和電流輸出和輸出電流

臺式電腦電源是電腦硬件的重要組成部分。 它為計算機的各個部件提供所需的電壓和電流。 不同的硬件設備和組件有不同的電壓和電流輸出。 下面詳細介紹臺式電腦電源各線的電壓&#xff0c;包括3.3V、5V、12V、-12V、-5V和5VSB&#xff0c;以及它們的輸出電流和用途。 3.3V&#…

【AI+CAD】(一)ezdxf 解析DXF文件

DXF文件格式理解 DXF文件格式是矢量圖形文件格式&#xff0c;其詳細說明了如何表示不同的圖形元素。 DXF是一個矢量圖形文件&#xff0c;它捕獲CAD圖形的所有元素&#xff0c;例如文本&#xff0c;線條和形狀。更重要的是&#xff0c;DXF是用于在CAD應用程序之間傳輸數據的圖形…

STM32自學?I2C

這里只是大體介紹&#xff0c;具體的可參考STM32數據手冊

數據結構與算法-選擇排序

引言 在計算機科學中&#xff0c;數據結構和算法是兩個至關重要的基石。它們共同決定了程序的效率、可讀性和可維護性。本文我們將聚焦于一種基礎而直觀的排序算法——選擇排序&#xff0c;并探討其內在的工作機制以及在實際應用中的優缺點。 一、什么是選擇排序&#xff1f; …

Leetcode 3067. Count Pairs of Connectable Servers in a Weighted Tree Network

Leetcode 3067. Count Pairs of Connectable Servers in a Weighted Tree Network 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3067. Count Pairs of Connectable Servers in a Weighted Tree Network 1. 解題思路 這一題沒想到什么好的方法&#xff0c;走的是暴力求解的路…