【鸿蒙】HarmonyOS NEXT星河入门到实战7-ArkTS语法进阶

目录

1、Class类

1.1 Class类 实例属性

1.2  Class类 构造函数

1.3 Class类 定义方法

1.4 静态属性 和 静态方法

1.5 继承 extends 和 super 关键字

1.6 instanceof 检测是否实例

1.7.修饰符(readonly、private、protected 、public)

1.7.1 readonly

1.7.2 Private 

 1.7.3 protected

 1.7.4 public

2、剩余参数和展开运算符

2.1 剩余参数语法

2.2 剩余参数和展开运算符

 3、接口补充

3.1 接口继承

3.2 接口实现

 4、泛型

4.1 泛型函数

4.2 泛型约束

4.3 多个泛型参数

 4.4 泛型接口

4.5 泛型类


前言:ArkTS语法进阶Class、剩余参数和展开运算符,同时包含对接口的补充说明、泛型

1、Class类

1.1 Class类 实例属性

注意定义类要设置初始值,不设置初始值要设置为可选字段 使用符号?

import window from '@ohos.window';class Cat {name: string = 'Tom'foods?: string
}// 基于类创建对象
let p: Cat = new Cat()
p.foods = 'sss'
console.log(p.name)
@Entry
@Component
struct Index {@State message: string = '@春天的菠菜';onPageShow(): void {window.getLastWindow(AppStorage.get("context"), (err, data) => {if (err.code) {console.error('Failed to get last window. Cause:' + JSON.stringify(err));return;}data.setFullScreen(true)});}build() {Column(){Text(p.name +'****'+ p.foods+'****'+ p.foods?.length).fontSize(20).fontWeight(700).backgroundColor(Color.Green).padding(10)}.width('100%').height(100)}
}

 

1.2  Class类 构造函数

import window from '@ohos.window';
@Extend(Text)
function textExtend(){.fontSize(20).fontWeight(700).backgroundColor(Color.Green).padding(10).margin(5)
}// 1 构造函数语法
class Food {name: stringprice: numberconstructor(name:string, price:number) {this.name = namethis.price = price}
}let f1 = new Food('西红柿', 2.23)
let f2= new Food('面条', 15.00)//********************************************************
interface iCat{name: stringprice: numberdesc: string
}// 多参数传参合并
class Cat {name: stringprice: numberdesc: stringconstructor(paramsObj: iCat) {this.name = paramsObj.namethis.price = paramsObj.pricethis.desc = paramsObj.desc}
}let p1: Cat = new Cat({name: '波斯猫',desc: '珀斯的猫',price: 123222
})@Entry
@Component
struct Index {@State message: string = '@春天的菠菜';onPageShow(): void {window.getLastWindow(AppStorage.get("context"), (err, data) => {if (err.code) {console.error('Failed to get last window. Cause:' + JSON.stringify(err));return;}data.setFullScreen(true)});}build() {Column(){Text(f1.name +'****'+ f1.price+'元').textExtend()Text(f2.name +'****'+ f2.price+'元').textExtend()Text(p1.name +'****'+ p1.price+'元'+'****'+p1.desc).textExtend()}.width('100%').height(100)}
}

 

1.3 Class类 定义方法

import window from '@ohos.window';
@Extend(Text)
function textExtend(){.fontSize(20).fontWeight(700).backgroundColor(Color.Green).padding(10).margin(5)
}class Person {name: stringage: numberconstructor(name: string,age: number) {this.name = namethis.age = age}// 类方法sayHi(yorName:string){return ('Hello!' + yorName + '我是' + this.name)}
}let p1: Person = new Person('波斯猫', 18)@Entry
@Component
struct Index {@State message: string = '@春天的菠菜';onPageShow(): void {window.getLastWindow(AppStorage.get("context"), (err, data) => {if (err.code) {console.error('Failed to get last window. Cause:' + JSON.stringify(err));return;}data.setFullScreen(true)});}build() {Column(){Text(p1.name +'****'+ p1.sayHi('春天的菠菜')).textExtend()}.width('100%').height(100)}
}

 

1.4 静态属性 和 静态方法

import window from '@ohos.window';
@Extend(Text)
function textExtend(){.fontSize(20).fontWeight(700).backgroundColor(Color.Green).padding(10).margin(5)
}class Robot {static version: string = 'V2.0'static  getRandom():number{return Math.random()}}@Entry
@Component
struct Index {@State message: string = '@春天的菠菜';onPageShow(): void {window.getLastWindow(AppStorage.get("context"), (err, data) => {if (err.code) {console.error('Failed to get last window. Cause:' + JSON.stringify(err));return;}data.setFullScreen(true)});}build() {Column(){Text(Robot.version +'****'+ Robot.getRandom()).textExtend()}.width('100%').height(100)}
}

1.5 继承 extends 和 super 关键字

import window from '@ohos.window';
@Extend(Text)
function textExtend(){.fontSize(20).fontWeight(700).backgroundColor(Color.Green).padding(10).margin(5)
}class Person {name: stringage: numberconstructor(name:string, age:number) {this.name =namethis.age = age}sayHi(): string{return 'Hello!'}}
class Student extends Person{grade: stringconstructor(name:string, age:number,grade: string) {// 父类中的构造函数super(name,age)this.grade = grade}// 子类想要重写父类的方法,只需提供同名的方法即可sayHi(): string{super.sayHi() // 保留了父类的,又新增了自己的return 'Student HI!'}study (): string {return '我爱学习'}}
class Teacher extends Person{}
class Worker extends Person{}let s1: Student = new Student('张三',18,'五年级')
let t1: Teacher = new Teacher('李四',32)
let w1: Worker = new Worker('王五', 46)@Entry
@Component
struct Index {@State message: string = '@春天的菠菜';onPageShow(): void {window.getLastWindow(AppStorage.get("context"), (err, data) => {if (err.code) {console.error('Failed to get last window. Cause:' + JSON.stringify(err));return;}data.setFullScreen(true)});}build() {Column(){Text( s1.name+ s1.sayHi()+s1.grade+s1.study()+'****'+ t1.name+t1.sayHi()).textExtend()}.width('100%').height(100)}
}

 

1.6 instanceof 检测是否实例

// console.log(typeof 111)
// console.log(typeof true)
// console.log(typeof 'abc')
//
// // typeof 仅能用于判断简单类型, 复杂类型需要用instanceof判断
// class Person {}
// class Student {}
// let p: Person = new Person()
// let s: Student = new Student()
// console.log(typeof p)
// console.log(typeof s)class Person {}
class Student extends Person {}
class Worker extends Person {}let s: Student = new Student()
console.log('判断结果:', s instanceof Student)
console.log('判断结果:', s instanceof Person)
console.log('判断结果:', s instanceof Worker)interface IObj {}
// 判断一个变量是否存的是数组
let temp: IObj = {}
console.log('是否是数组', temp instanceof Array)@Entry
@Component
struct Index {build() {// Row().width(100)Column() {}}
}

1.7.修饰符(readonly、private、protected 、public)

1.7.1 readonly

// 修饰符 readonly
class Cat {name: stringage: numberreadonly legs: number = 4constructor(name: string, age: number) {this.name = namethis.age = age}
}
let c1 = new Cat('小花', 2)
c1.name = '小美'
// c1.legs = 6 // 不能修改
console.log('姓名:', c1.name)// 3.1415926 圆周率
// Math.PI@Entry
@Component
struct Index {build() {// Row().width(100)Column() {}}
}

1.7.2 Private 

// class Person {
//   private name: string = ''
//   private age: number = 0
//   desc: string = '描述'
// }
// let p = new Person()
// console.log('实例访问:', p.name) // 无法再外部访问私有数据// class Student extends Person {
//   sayHi () {
//     console.log('访问私有的数据:', super.name) // 私有数据无法再(子类)访问
//   }
// }@Entry
@Component
struct Index {build() {// Row().width(100)Column() {}}
}

 1.7.3 protected

 

 1.7.4 public

class Person {protected name: stringprotected age: numberdesc: string = '描述'// 类的内容, 无论是私有还是保护, 都是可以访问的constructor(name: string, age: number) {this.name = namethis.age = age}
}
let p = new Person('小王', 18)
// console.log('实例访问:', p.name) // 无法在外部, 访问受保护的数据class Student extends Person {sayHi () {console.log('访问私有的数据:', super.name) // 保护的数据可以在子类访问}
}@Entry
@Component
struct Index {build() {// Row().width(100)Column() {}}
}

2、剩余参数和展开运算符

2.1 剩余参数语法

// ... 展开运算符, 用于数组的平铺合并
let arr1: number[] = [1,2,3]
let arr2: number[] = [4,5,6]
let newArr: number[] = [...arr1, ...arr2]
console.log('最终的数组', newArr)@Entry
@Component
struct Index {build() {Column() {}}
}

2.2 剩余参数和展开运算符

合并数组 

// ... 展开运算符, 用于数组的平铺合并
let arr1: number[] = [1,2,3]
let arr2: number[] = [4,5,6]
let newArr: number[] = [...arr1, ...arr2]
console.log('最终的数组', newArr)@Entry
@Component
struct Index {build() {Column() {}}
}

 3、接口补充

3.1 接口继承

interface IAnimal {name: stringage: number
}
interface ICat extends IAnimal {hair: string
}
interface IDog extends IAnimal {color: string
}
let dog1: IDog = {name: '小泰迪',age: 2,color: '棕色'
}@Entry
@Component
struct Index {build() {Column() {}}
}

3.2 接口实现

// 接口实现: 定义一个接口, 约束类 => 类需要按照接口的要求, 实现类的主体
interface IDog {name: stringage: numberjump: () => void
}// 基于接口, 实现类
class Dog implements IDog {name: stringage: numberdesc: stringconstructor(name: string, age: number, desc: string) {this.name = namethis.age = agethis.desc = desc}jump() {}
}
let dog: Dog = new Dog('小飞', 2, '是一只非常帅气的二哈')
dog.jump()function 函数名<Type>(temp:Type):Type{return temp
}@Entry
@Component
struct Index {build() {Column() {}}
}

 4、泛型

4.1 泛型函数

// 泛型: 广泛的类型 => 类型可以作为参数传递过来, 类型是[可变]的
// function 函数名<Type> (形参: Type): Type {
//   return 形参
// }// 封装了一个函数: 传入什么样的参数, 就立刻返回什么样的参数
function fn<T> (param: T) : T {return param
}
fn<string>('abc')
fn<number>(123)
fn<boolean>(true)
fn<number[]>([1, 2, 3, 4, 5])// 会默认根据传参, 进行类型推断, 动态的配置 T 类型参数 的值
fn(true)
fn([1, 2, 3, 4, 5])// 练习1: 定义函数, 参数是数组(存的类型不定), 返回数组的长度
function getLength<T> (arr: T[]) : number {return arr.length
}
console.log('', getLength<number>([1, 2, 3]))
console.log('', getLength<string>(['1', 'aa', 'bb', 'cc']))// 练习2: 定义函数, 参数是数组(存的类型不定), 返回数组的最后一项
function getLast<T> (arr: T[]) : T {return arr[arr.length - 1]
}
console.log('', getLast<number>([1, 2, 3, 4, 99]))
console.log('', getLast<string>(['a', 'b', 'c']))@Entry
@Component
struct Index {build() {Column() {}}
}

4.2 泛型约束

// 泛型约束: 给传递的类型参数, 添加限制
interface ILength {length: number
}
function fn<T extends ILength>(param: T) {console.log('', param.length)
}fn<string>('abc')
fn<number[]>([1, 2, 3])class Desk {length = 2
}
let d = new Desk()
fn<Desk>(d)@Entry
@Component
struct Index {build() {Column() {}}
}

4.3 多个泛型参数

// 多个泛型变量 => 传递多个类型参数
function fn<T1, T2> (param1: T1, param2: T2) {console.log('参数1', param1)console.log('参数2', param2)
}
fn<string, boolean>('abc', true)
fn<number, string>(123, 'abc')
fn<string[], number[]>(['a', 'b'], [1, 2])@Entry
@Component
struct Index {build() {Column() {}}
}

新版本已经能自动识别

 

 4.4 泛型接口

// 泛型接口
interface IdFunc<T> {// 约定有两个方法 (id类型不定, string number)// 1. 传入 id 值, 就返回 id 值// 2. 返回一个 ids 数组id: (value: T) => Tids: () => T[]
}let obj: IdFunc<number> = {id(value: number) {return value},ids() {return [1, 2, 3]}
}let obj2: IdFunc<string> = {id(value: string) {return value},ids() {return ['001', '002', '003']}
}@Entry
@Component
struct Index {build() {Column() {}}
}

4.5 泛型类

// 泛型类: 定义类的时候, 配合泛型一起定义
class Person <T>{id: Tconstructor(id: T) {this.id = id}getId (): T {return this.id}
}
let p: Person<number> = new Person<number>(10)
let p2: Person<string> = new Person<string>('abc')@Entry
@Component
struct Index {build() {Column() {}}
}

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

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

相关文章

C++函数在库中的地址

本文讲述C如何直接调用动态库dll或者so中的函数。 首先我们准备一个被调用库&#xff0c;这个库里面有两个函数&#xff0c;分别是C98 与 C11 下的&#xff0c;名称是run2和run1。 被调用库 相关介绍请看之前的文章《函数指针与库之间的通信讲解》。 //dll_ex_im.h #ifndef…

蓝牙耳机是入耳式的好还是开放式的好?2024开放式耳机推荐

个人推荐入开放式耳机&#xff0c;戴起来更舒服&#xff0c;主要有以下几方面原因&#xff1a; 减少对耳部的压迫&#xff1a; 不入耳设计&#xff1a;开放式耳机通常不需要插入耳道&#xff0c;避免了对耳道的直接压迫。入耳式耳机的耳塞长时间塞在耳道内&#xff0c;会对耳…

校园水电费管理|基于java的校园水电费管理小程序系统 (源码+数据库+文档)

校园水电费管理 目录 基于java的校园水电费管理小程序系统 一、前言 二、系统设计 三、系统功能设计 小程序端 后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕…

Python基础知识学习(2)

一&#xff0c;分支条件判断语句 在python中&#xff0c;分支条件语句如下&#xff1a; 1&#xff0c;判断条件&#xff1a;if exception: 2&#xff0c;接着判断的语句为&#xff1a;elif exception: 3&#xff0c;最后的条件为&#xff1a;else: 4&#xff0c;通过缩进来表示…

46.面向对象综合训练-文字版格斗游戏

1.首先创建标准的Javabean类 import java.util.Random;public class 格斗游戏 {private String name;private int blood;public 格斗游戏() {}public 格斗游戏(String name, int blood) {this.name name;this.blood blood;}public String getName() {return name;}public vo…

基于A2C与超启发式的航天器星载自主任务规划算法-笔记

1. Actor-Critic 模块 主要文件&#xff1a;AC.py, PolicyNet.py, ValueNet.py作用&#xff1a;该模块实现了 A2C&#xff08;Advantage Actor-Critic&#xff09;强化学习算法。其中&#xff0c;ActorCritic 类是核心&#xff0c;它同时管理策略网络&#xff08;Actor&#x…

2-95 基于matlab的模板定位

基于matlab的模板定位。利用①相关匹配&#xff08;Correlation Matching&#xff09;、②基于Hausdorff距离匹配方法 及③考虑对场景图象距离变换&#xff08;Distance Transform&#xff09;的Hausdorff距离匹配方法,实现模板目标在场景图象中的定位。程序已调通&#xff0c;…

PMP--一模--解题--81-90

文章目录 4.整合管理81、 [单选] 一位先前不活跃的干系人参与程度突然增加&#xff0c;这种意外的参与导致了一些变更请求。项目经理应该做什么&#xff1f; 4.整合管理82、 [单选] 公司的新产品系列将在两个月内发布&#xff0c;95%的项目任务均已完成。但是&#xff0c;管理层…

开发一款通过蓝牙连接控制水电表的微信小程序

增强软硬件交互 为了更好的解决师生生活中的实际问题&#xff0c;开发蓝牙小程序加强了和校区硬件的交互。 比如通过蓝牙连接控制水电表&#xff0c;减少实体卡片的使用。添加人脸活体检测功能&#xff0c;提高本人认证效率&#xff0c;减少师生等待时间。 蓝牙水电控展示 蓝…

jdk相关介绍

JDK&#xff0c;全称Java Development Kit&#xff0c;是Java语言开发的基础工具包。它包含了Java运行时环境&#xff08;JRE&#xff09;以及用于开发Java应用程序的各种工具和库。JDK为Java程序员提供了编译、调试和运行Java应用程序所需的全部环境。 JDK的主要组成部分包括&…

瞳孔检测系统源码分享

瞳孔检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

EMT-DAVT--基于子空间分布对齐和决策变量转移的多目标多任务优化

EMT-DAVT–基于子空间分布对齐和决策变量转移的多目标多任务优化 title&#xff1a; Multiobjective Multitasking Optimization With Subspace Distribution Alignment and Decision Variable Transfer author&#xff1a; Weifeng Gao, Jiangli Cheng, Maoguo Gong, Hong L…

Python酷库之旅-第三方库Pandas(118)

目录 一、用法精讲 521、pandas.DataFrame.drop_duplicates方法 521-1、语法 521-2、参数 521-3、功能 521-4、返回值 521-5、说明 521-6、用法 521-6-1、数据准备 521-6-2、代码示例 521-6-3、结果输出 522、pandas.DataFrame.duplicated方法 522-1、语法 522-2…

III 网络诈骗也玩区块链?加密货币的分类小知识!

大家好啊&#xff0c;我是豆小匠。 区块链第三期&#xff0c;这期拓展一下加密货币的话题。 如果要用加密货币来发工资&#xff0c;你希望用哪个&#xff1f; 你大概不会希望是比特币&#xff0c;比特币的波动性太高&#xff0c;可能刚发下来工资&#xff0c;亏损就超过了10%…

Java小区物业管理系统

技术架构&#xff1a; springboot mybatis thymeleaf Mysql5.7 有需要该项目的小伙伴可以添加我Q&#xff1a;598748873&#xff0c;备注&#xff1a;CSDN 功能描述&#xff1a; 控制台、数据库、楼栋管理、单元管理、房屋管理、车位管理、缴费类型、缴费管理、公告管理…

Linux下进程间的通信--共享内存

共享内存概述&#xff1a; 共享内存是进程间通信的一种方式&#xff0c;它允许两个或多个进程共享一个给定的存储区。共享内存是最快的一种IPC形式&#xff0c;因为它允许进程直接对内存进行读写操作&#xff0c;而不需要数据在进程之间复制。 共享内存是进程间通信&#xff…

Python基础语法(3)下

列表和元组 列表是什么&#xff0c;元组是什么 编程中&#xff0c;经常需要使用变量&#xff0c;来保存/表示数据。变量就是内存空间&#xff0c;用来表示或者存储数据。 如果代码中需要表示的数据个数比较少&#xff0c;我们直接创建多个变量即可。 num1 10 num2 20 num3…

2024.9.12(k8s环境搭建2)

一、接9.11 19、部署calico的pod 4. 查看容器和节点状态 异常处理&#xff1a; 出现Init:0/3&#xff0c;查看node节点 /var/log/messages是否有除网络异常之外的报错信息 三台机器执行&#xff1a;&#xff08;更新版本&#xff09; yum list kernel yum update kernel reb…

【ArcGIS】栅格计算器原理及案例介绍

ArcGIS&#xff1a;栅格计算器原理及案例介绍 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍案例案例1&#xff1a;计算栅格数据平均值 参考 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍 描述&#xff1a;在类似计算器的界面中&#xff0c;…

Linux进程概念(下)

前言 上文介绍了进程的基本概念&#xff0c;进程内核数据结构可执行程序&#xff0c;查看进程的方式ps 和/proc指令。 又熟悉常见的进程状态&#xff0c;状态修改的本质就是将PCB标志位更改&#xff0c;然后放到指定的队列中。 本文继续介绍进程的概念&#xff0c;将介绍进程…