鸿蒙进阶篇-接口和泛型

hello大家好啊,这里是鸿蒙开天组,今天我们来学习鸿蒙中的接口和泛型。

接口和泛型在面向对象编程中,是两个很常见的概念,而今天的学习呢,是不需要在编辑器中实现什么东西的,关键是要理解这些概念,一看到类似的东西就能反应过来是什么意思。

一、接口

基础篇中,也给大家科普过接口的定义,就是拿来定义类型的,然后咱们今天看看它的其他用法

1.接口继承

接口继承,字面含义,就是一个接口继承另一个接口,比如A接口继承B接口,既然是继承,那B中的属性、类型和方法,A中自然也会有,同时接口A还可以自定义自己的属性和类型,语法关键字是extends,最基本的代码结构如下:

interface 接口1{属性1:类型
}
interface 接口2 extends 接口1 {属性2:类型
}

我们再来根据基础篇的例子,定义一个程序猿接口:

interface Person {name: stringage: numberweight: number
}interface Programmer extends Person{
hair:string
}const KK:Programmer={
name: '卡卡'
age: 18
weight: 180
hair:'发量浓密'
}

从以上代码就可以看出继承的用处,假如我有十几个不同职业,而所有职业都有name、age、weight这三个属性,不继承的话就需要把这三个写上十几次;而使用了继承,即可实现代码复用,只写一次完事。

2.接口实现

接口实现通常指的是类实现接口的过程。这个过程涉及到定义一个类,使其遵循接口中声明的方法和属性,语法关键字是implements,最基本的代码结构如下:

interface 接口{属性:类型方法:方法类型
}class 类 implements 接口{// 必须实现 接口中定义的 属性、方法,否则会报错
}

接口实现和接口继承相似,当然也是为了代码复用而设计,只不过换成了类以及需要初始化,例子如:

interface ICat {name: stringMiao: () => void
}class Cat implements ICat {name: string = ''food: string = ''Miao() {}
}

二、泛型

看着很高端的名字,实际上,只要你理解了参数是什么意思,就很容易理解泛型,简单地说,泛型就是一个类型参数,它也是一个待定的参数,只不过它比较特殊,代替的是特定的类型而已。它的作用是,让函数的类型更加灵活,不受到写死类型的限制。

1.泛型定义

举一个最简单的例子,我们有一个函数,咱们传入什么就返回什么:

// 1. 字符串
function retStr(arg: string): string {return arg
}// 2. 数字
function retNum(arg: number): number {return arg
}// 3. 布尔
function retBoolean(arg: boolean): boolean {return arg
}

这几个函数实现的逻辑都是一样的,就只有传入和返回的类型不一样,如果还有很多其他类型的,那就要多写很多个相似的函数,那么能否只定义一个函数,实现一样的效果呢?答案是可以的,只要写成以下形式即可:

function ret<T>(arg: T): T {return arg
}

以上代码中,只是在函数名后面加了尖括号和T“<T>”,然后分别把参数和返回值的类型也相应换成了T而已,就搞定啦~

而其中最关键的是尖括号,在这里它是一个代表泛型的标记,固定写法;而T是泛型参数的名字,和以前学的形参相似,可以自行定义,比如你写成Q、Type都可以,有意义即可,建议首字母大写,常用的是T、Type;

2.泛型使用

当然,在咱们定义泛型函数的时候,可以只用泛型代替具体类型,而到了使用时,再把具体类型加上即可,如果编辑器能推断出类型,那么具体类型不写也是可以的,尝试对比一下代码:

// 1. 字符串
function ReturnStr(arg: string): string {return arg
}//2.通用类型
function ret<T>(arg: T): T {return arg
}//对比组1,一样的使用
ReturnStr('1')
ret('1')//对比组2,补充具体类型与否
ret<number>(1)
ret(1)

3.泛型约束

如果开发中不希望任意的类型都可以传递给 类型参数 ,就可以通过泛型约束来完成

基本语法:

interface 接口{属性:类型
}
function 函数<Type extends 接口>(){}// 后续使用函数时,传入的类型必须要有 接口中的属性

说白了就是T后面加个extends关键字,和需要限定的接口名即可,这个关键字我们上面才学过,用来继承接口,你也可以变相理解成继承接口类型:

interface IFood {food: string
}function logFood<T extends IFood>(param: T) {console.log('吃的挺好:', param.food)
}//logFood的调用方式1
const meal: IFood = { food: 'burger' };
logFood(meal)//logFood的调用方式2
logFood({ food: 'burger' } as IFood)

4.多个泛型参数

日常开发的时候,如果有需要可以添加多个 类型变量,只需要定义并使用 多个类型变量即可,比如下面的代码,在尖括号里用逗号隔开的T1和T2:

function funcA<T1, T2>(param1: T1, param2: T2) {console.log('参数 1', param1)console.log('参数 2', param2)
}funcA<string, number>('苹果', 12345)
funcA<string[], boolean[]>(['香蕉'], [false])

5.泛型接口

 定义接口时结合泛型,那么这个接口就是 泛型接口,比如下面的:

interface IdFunc<Type> {id: (value: Type) => Typeids: () => Type[]
}let obj: IdFunc<string> = {id(value) { return value },ids() { return ['香蕉', '苹果', '西瓜'] }
}

6.泛型类

和泛型接口类似,如果定义类的时候结合泛型,那么这个类就是 泛型类。这些概念都是相似的,只要我们掌握了本质,其他的都是看一眼就知道是些啥玩意:

// 定义
class Person <T> {id: Tconstructor(id: T) {this.id = id}getId(): T {return this.id}
}// 使用
let p = new Person<number>(1000)

好了,今天的分享就到这里,感谢阅读,如果对你有那么一点点帮助,还请点个赞点个收藏,那都是鸿蒙开天组更新的动力!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS NEXT:模块化项目 ——修改应用图标+启动页等

涉及官方文档 应用配置文件应用/组件级配置图标资源规范 涉及到app.json5配置文件和module.json5配置文件 1、 icon和label的校验。 IDE从5.0.3.800版本开始&#xff0c;不再对module.json5中的icon和label做强制校验&#xff0c;因此module.json5与app.json5只需要选择其一…

dolphinscheduler

dolphinscheduler 官网地址&#xff1a; https://dolphinscheduler.apache.org/zh-cn/docs/3.2.1/about/hardware 1. 概念&#xff1a;dolphinscheduler是一个功能强大的开源调度系统&#xff0c;专为管理和调度大规模数据处理任务设计。 2. 特点&#xff1a; 分布式架构、支持…

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测 目录 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 吐血售&#xff01;聚划算&#xff01;Transforme…

【C++】C++11特性(上)

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C 个人主页&#xff1a;Celias blog~ 目录 一、列表初始化 二、std::initializer_list 三、右值引用和移…

Maven 构建项目

Maven 是一个项目管理和构建工具&#xff0c;主要用于 Java 项目。它简化了项目的构建、依赖管理、报告生成、发布等一系列工作。 构建自动化&#xff1a;Maven 提供了一套标准化的构建生命周期&#xff0c;包括编译、测试、打包、部署等步骤&#xff0c;通过简单的命令就可以执…

在jquery里,使用$.each()函数循环数组,对象,dom的用法

介绍 $.each() 能遍历一维数组&#xff0c;多维数组&#xff0c;JSON对象&#xff0c;dom2元素。在开发中可以很高效的处理各种数据结构。前提&#xff0c;需要导入jquery 使用 遍历JSON对象 var objDemo {name: linda,age:12, desc: a girl};$.each(objDemo,function(i,va…

UniApp 应用、页面与组件的生命周期详解

UniApp 应用、页面与组件的生命周期详解 在uni-app中包含了 应用生命周期、页面生命周期、和组件生命周期&#xff08; Vue.js的&#xff09;函数。 应用生命周期 应用生命周期仅可在App.vue中监听&#xff0c;在其它页面监听无效。 <script>export default {onLaunc…

进程的创建/终止/等待/替换

目录 一、进程创建 &#xff08;一&#xff09;fork函数的概念 &#xff08;二&#xff09;fork函数示例 二、进程终止 &#xff08;一&#xff09;退出码的概念 &#xff08;二&#xff09;退出码的含义 &#xff08;三&#xff09;相关函数和指令 三、进程等待 &…

【c++丨STL】list的使用

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 list简介 一、list的默认成员函数 构造函数(constructor) 析构函数 赋值重载 二、list的迭代器接口 迭代器的功能分类 三、list的容量…

CANoe导入CAN DataBase(DBC文件)

Canoe是一款用于汽车网络仿真和开发的工具&#xff0c;它支持导入DBC文件&#xff08;CAN Database文件&#xff09;以定义和配置CAN网络中的消息、信号和节点。 将DBC文件拷贝至我们的工程目录的DBC文件夹内&#xff0c;随后在Simulation Setup中右击DataBase&#xff0c;进…

nacos配置管理

1、增加依赖 <!--配置管理的依赖 --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.1.0.RELEASE</version> </dependency><de…

每日OJ题_牛客_奇数位丢弃_找规律/模拟_C++_Java

目录 牛客_奇数位丢弃_找规律/模拟 题目解析 C代码1模拟 C代码2找规律 Java代码找规律 牛客_奇数位丢弃_找规律/模拟 奇数位丢弃_牛客题霸_牛客网 描述&#xff1a; 对于一个由 0..n 的所有数按升序组成的序列&#xff0c;我们要进行一些筛选&#xff0c;每次我们丢弃去…

解决table下tr或td选中不生效的问题

目录 一、问题描述 1.首先我们来看一下代码结构 2.检查代码&#xff08;鼠标右键或按下F12&#xff09; 3.解决方案 一、问题描述 解决table下tr或td选中不生效&#xff0c;页面刷新无效果 1.首先我们来看一下代码结构 这里我们的结构是table标签下的tr&#xff0c;tr当…

学籍拍照助手,中小学新生学籍证件照电脑端拍照教程

新学期过半&#xff0c;许多中小学学籍管理员都忙碌起来&#xff0c;为孩子们准备学籍所需的证件照。传统的照相馆拍摄、向家长收集都存在一些弊端&#xff0c;下面就来介绍如何使用校园学籍拍照助手&#xff0c;更智能的完成学籍证件照的拍摄。 1. 准备工作在开始之前&#xf…

SE30 程序运行时间评估

日常执行报表的时候 可能会遇到报表反应时间太长 用户无法接受的情况&#xff0c;此时 作为IT同事 需要分析程序的运行时间&#xff0c;可以使用SAP标准事务码SE30. 1、选择运行时分析-测量-立即执行&#xff08;有些程序可能没有此按钮 需联系开发增加&#xff09; 2、以发…

T-Rex Label标注

这个是做大量数据集的时候用到的&#xff0c;但我觉得他比labelimg好用。 仙人指路✈trexlabel 基本标注 如果是从新开始的话就是 导入图片然后进行直接标注 如果是后期添加图片继续标注&#xff0c;选择你需要的数据集格式&#xff0c;导入即可。 如此&#xff0c;进去就…

部署zabbix遇到问题: cannot find a valid baseurl for repo:centos-sclo-rh/x86 64 怎么解决 ?

安装 Zabbix 前端包&#xff0c;提示cannot find a valid baseurl for repo&#xff1a;centos-sclo-rh/x86 64 安装zabbix前端包 # yum install zabbix-web-mysql-scl zabbix-apache-conf-scl 解决办法&#xff1a; 原因是&#xff1a;CentOS7的SCL源在2024年6月30日停止维护…

小程序+公众号统一账号unionid,实现pc+公众号+小程序统一身份

一、微信开放平台 注册开发者账号、绑定公众号、小程序 二、小程序端获取unionid 1获取code wx.login({success: res > {console.log("getCode", res.code)this.getOpenId(res.code)}}) 2通过code调用后台方法获取openid,unionid 小程序端 getOpenId: functi…

LeetCode【0037】解数独

本文目录 1 中文题目2 求解方法&#xff1a;递归回溯法2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 编写一个程序&#xff0c;通过填充空格来解决数独问题。数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只…

零碎02-接口文档管理

目录 一、背景故事 二、解决方案分析 1. 静态文档方案 2. Swagger Springfox 3. Knife4j增强方案 三、示例 1. 添加依赖 2. 配置Knife4j 3. 创建knife4j配置类 4. 启动Spring Boot项目并访问接口文档 5. 使用示例 6. 测试和使用 四、总结 一、背景故事 酷乐是一名…