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.mzph.cn/news/719392.shtml

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

相关文章

【大厂AI课学习笔记NO.61】环境部署的选择

主要是选择单机和分布式、生产和开发环境的规划等。 开发环境、测试环境、预发布环境和生产环境是软件开发和部署过程中常见的几个环境,它们各自的定义、区别、联系以及实现的关键技术如下: 1. 开发环境(Development Environment&#xff09…

完全解析淘宝天猫详情接口API:购物小白也能秒变高手

在如今的电商领域中,淘宝和天猫是最为重要和热门的平台之一。作为购物平台的用户,我们通常只是浏览商品的页面,点击购买和支付,却未能深入了解背后的技术信息。然而,淘宝天猫详情接口API的了解和运用,联讯数…

力扣hot4--双指针

题目: 双指针想法: i 指针在数组不为 0 的地方停留,j 指针在每个地方停留,依次交换 i 和 j 指针。当 i 指针遍历完所有数组元素时,j 指针指向的元素及后面的元素都为0。 代码如下: C版本 class Solution …

冒泡、插入、希尔、选择、堆排序、快速排序(附源码)

目录 插入排序: 核心思想: 时间复杂度: 冒泡排序: 核心思想: 时间复杂度: 希尔排序: 核心思想: 时间复杂度: 选择排序: 核心思想: 时间…

告别手动填写邀请码,这款App数据统计工具帮你轻松实现

在移动互联网时代,App的推广和运营已成为各大企业的必修课。然而,面对错综复杂的推广渠道和浩如烟海的数据,如何精准地追踪用户来源、优化推广策略,一直是困扰着运营者的难题。今天,我们就来聊聊一款能够帮助你轻松解决…

新火种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扩展接口,来完成数据采集、数据回放以及实时信号处理算…

Java---文件,流✨❤️

文章目录 1.遍历文件夹2.遍历子文件夹3.练习流4.以字节流的形式读取文件内容5.以字节流的形式向文件写入数据顶折纠问6 .写入数据到文件 1.遍历文件夹 一般说来操作系统都会安装在C盘,所以会有一个 C:\WINDOWS目录。 遍历这个目录下所有的文件(不用遍历子目录) 找出…

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

xss.haozi.me:0x07

<img src1 onerroralert(1)

tomcat下载安装配置教程

tomcat下载安装配置教程 我是使用tomcat下载安装及配置教程_tomcat安装-CSDN博客 此贴来进行安装配置&#xff0c;原文21年已经有些许不同。 下载tomcat 官网&#xff1a;http://tomcat.apache.org/ 我们老师让安装8.5以上&#xff0c;所以我直接选择版本9 点击9页面之后…

HTTPS的实现原理

图片来源&#xff1a;HTTPS 详解一&#xff1a;附带最精美详尽的 HTTPS 原理图 - 个人文章 - SegmentFault 思否 加密流程按图中的序号分为&#xff1a; 客户端请求 HTTPS 网址&#xff0c;然后连接到 server 的 443 端口 (HTTPS 默认端口&#xff0c;类似于 HTTP 的80端口)。…

Windows批处理:bat文件学习

目录 第一章、快速了解Windows批处理1.1&#xff09;Windows批处理相关概念介绍1.1.1&#xff09;批处理的起源1.1.2&#xff09;bat文件介绍 1.2&#xff09;Demo1.2.1&#xff09;创建文件添加命令1.2.2&#xff09;bat脚本中的命令解释 第二章、实例2.1&#xff09;点击bat文…

navicat安装11.3

一、安装navicat 1、下载navicat 2、解压压缩包 3、点击exe文件 4、输入密钥&#xff1a; NAVH-WK6A-DMVK-DKW3 5、点击打开&#xff1a; 输入连接参数&#xff1a; 6、查看连接好仓库 7、 在使用navicat来编写sql语句 8、编写语句 连接不上问题&#xff0c;检查问题&#…