鸿蒙开发入门day05-ArkTs语言(接口与关键字)

news2024/11/14 13:51:49

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ)

目录

ArkTS语言介绍  

接口

接口属性

接口继承

泛型类型和函数

泛型类和接口

泛型约束

泛型函数

泛型默认值

模块

导出

导入

静态导入

动态导入

导入HarmonyOS SDK的开放能力

顶层语句

程序入口

关键字

this


ArkTS语言介绍  

接口

接口声明引入新类型。接口是定义代码协定的常见方式。

任何一个类的实例只要实现了特定接口,就可以通过该接口实现多态。

接口通常包含属性和方法的声明

示例:

interface Style {
  color: string // 属性
}
interface AreaSize {
  calculateAreaSize(): number // 方法的声明
  someMethod(): void;     // 方法的声明
}

实现接口的类示例:

// 接口:
interface AreaSize {
  calculateAreaSize(): number // 方法的声明
  someMethod(): void;     // 方法的声明
}

// 实现:
class RectangleSize implements AreaSize {
  private width: number = 0
  private height: number = 0
  someMethod(): void {
    console.log('someMethod called');
  }
  calculateAreaSize(): number {
    this.someMethod(); // 调用另一个方法并返回结果
    return this.width * this.height;
  }
}

接口属性

接口属性可以是字段、getter、setter或getter和setter组合的形式。

属性字段只是getter/setter对的便捷写法。以下表达方式是等价的:

interface Style {
  color: string
}
interface Style {
  get color(): string
  set color(x: string)
}

实现接口的类也可以使用以下两种方式:

interface Style {
  color: string
}

class StyledRectangle implements Style {
  color: string = ''
}
interface Style {
  color: string
}

class StyledRectangle implements Style {
  private _color: string = ''
  get color(): string { return this._color; }
  set color(x: string) { this._color = x; }
}

接口继承

接口可以继承其他接口,如下面的示例所示:

interface Style {
  color: string
}

interface ExtendedStyle extends Style {
  width: number
}

继承接口包含被继承接口的所有属性和方法,还可以添加自己的属性和方法。

泛型类型和函数

泛型类型和函数允许创建的代码在各种类型上运行,而不仅支持单一类型。

泛型类和接口

类和接口可以定义为泛型,将参数添加到类型定义中,如以下示例中的类型参数Element:

class CustomStack<Element> {
  public push(e: Element):void {
    // ...
  }
}

要使用类型CustomStack,必须为每个类型参数指定类型实参:

let s = new CustomStack<string>();
s.push('hello');

 编译器在使用泛型类型和函数时会确保类型安全。参见以下示例:

let s = new CustomStack<string>();
s.push(55); // 将会产生编译时错误

泛型约束

泛型类型的类型参数可以被限制只能取某些特定的值。例如,MyHashMap<Key, Value>这个类中的Key类型参数必须具有hash方法。

interface Hashable {
  hash(): number
}
class MyHashMap<Key extends Hashable, Value> {
  public set(k: Key, v: Value) {
    let h = k.hash();
    // ...其他代码...
  }
}

在上面的例子中,Key类型扩展了Hashable,Hashable接口的所有方法都可以为key调用。

泛型函数

使用泛型函数可编写更通用的代码。比如返回数组最后一个元素的函数:

function last(x: number[]): number {
  return x[x.length - 1];
}
last([1, 2, 3]); // 3

如果需要为任何数组定义相同的函数,使用类型参数将该函数定义为泛型:

function last<T>(x: T[]): T {
  return x[x.length - 1];
}

现在,该函数可以与任何数组一起使用。

在函数调用中,类型实参可以显式或隐式设置:

// 显式设置的类型实参
last<string>(['aa', 'bb']);
last<number>([1, 2, 3]);

// 隐式设置的类型实参
// 编译器根据调用参数的类型来确定类型实参
last([1, 2, 3]);

泛型默认值

泛型类型的类型参数可以设置默认值。这样可以不指定实际的类型实参,而只使用泛型类型名称。下面的示例展示了类和函数的这一点。

class SomeType {}
interface Interface <T1 = SomeType> { }
class Base <T2 = SomeType> { }
class Derived1 extends Base implements Interface { }
// Derived1在语义上等价于Derived2
class Derived2 extends Base<SomeType> implements Interface<SomeType> { }

function foo<T = number>(): T {
  // ...
}
foo();
// 此函数在语义上等价于下面的调用
foo<number>();

模块

程序可划分为多组编译单元或模块。

每个模块都有其自己的作用域,即,在模块中创建的任何声明(变量、函数、类等)在该模块之外都不可见,除非它们被显式导出。

与此相对,从另一个模块导出的变量、函数、类、接口等必须首先导入到模块中。

导出

可以使用关键字export导出顶层的声明。

未导出的声明名称被视为私有名称,只能在声明该名称的模块中使用。

注意:通过export方式导出,在导入时要加{}。

export class Point {
  x: number = 0
  y: number = 0
  constructor(x: number, y: number) {
    this.x = x;
    this.y = y;
  }
}
export let Origin = new Point(0, 0);
export function Distance(p1: Point, p2: Point): number {
  return Math.sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
}

导入

静态导入

导入声明用于导入从其他模块导出的实体,并在当前模块中提供其绑定。导入声明由两部分组成:

  • 导入路径,用于指定导入的模块;
  • 导入绑定,用于定义导入的模块中的可用实体集和使用形式(限定或不限定使用)。

导入绑定可以有几种形式。

假设模块具有路径“./utils”和导出实体“X”和“Y”。

导入绑定* as A表示绑定名称“A”,通过A.name可访问从导入路径指定的模块导出的所有实体:

import * as Utils from './utils'
Utils.X // 表示来自Utils的X
Utils.Y // 表示来自Utils的Y

导入绑定{ ident1, ..., identN }表示将导出的实体与指定名称绑定,该名称可以用作简单名称:

import { X, Y } from './utils'
X // 表示来自utils的X
Y // 表示来自utils的Y

如果标识符列表定义了ident as alias,则实体ident将绑定在名称alias下:

import { X as Z, Y } from './utils'
Z // 表示来自Utils的X
Y // 表示来自Utils的Y
X // 编译时错误:'X'不可见
动态导入

应用开发的有些场景中,如果希望根据条件导入模块或者按需导入模块,可以使用动态导入代替静态导入。

import()语法通常称为动态导入dynamic import,是一种类似函数的表达式,用来动态导入模块。以这种方式调用,将返回一个promise。

如下例所示,import(modulePath)可以加载模块并返回一个promise,该promise resolve为一个包含其所有导出的模块对象。该表达式可以在代码中的任意位置调用。

let modulePath = prompt("Which module to load?");
import(modulePath)
.then(obj => <module object>)
.catch(err => <loading error, e.g. if no such module>)

如果在异步函数中,可以使用let module = await import(modulePath)。

// say.ts
export function hi() {
  console.log('Hello');
}
export function bye() {
  console.log('Bye');
}

那么,可以像下面这样进行动态导入:

async function test() {
  let ns = await import('./say');
  let hi = ns.hi;
  let bye = ns.bye;
  hi();
  bye();
}

更多的使用动态import的业务场景和使用实例见动态import。

导入HarmonyOS SDK的开放能力

HarmonyOS SDK提供的开放能力(接口)也需要在导入声明后使用。可直接导入接口模块来使用该模块内的所有接口能力,例如:

import UIAbility from '@ohos.app.ability.UIAbility';

从HarmonyOS NEXT Developer Preview 1版本开始引入Kit概念。SDK对同一个Kit下的接口模块进行了封装,开发者在示例代码中可通过导入Kit的方式来使用Kit所包含的接口能力。其中,Kit封装的接口模块可查看SDK目录下Kit子目录中各Kit的定义。

通过导入Kit方式使用开放能力有三种方式:

方式一:导入Kit下单个模块的接口能力。例如:

import { UIAbility } from '@kit.AbilityKit';

方式二:导入Kit下多个模块的接口能力。例如:

import { UIAbility, Ability, Context } from '@kit.AbilityKit';

方式三:导入Kit包含的所有模块的接口能力。例如:

import * as module from '@kit.AbilityKit';

其中,“module”为别名,可自定义,然后通过该名称调用模块的接口。

顶层语句

模块可以包含除return语句外的任何模块级语句。

如果模块包含主函数(程序入口),则模块的顶层语句将在此函数函数体之前执行。否则,这些语句将在执行模块的其他功能之前执行。

程序入口

程序(应用)的入口是顶层主函数。主函数应具有空参数列表或只有string[]类型的参数。

function main() {
  console.log('this is the program entry');
}

关键字

this

关键字this只能在类的实例方法中使用。

class A {
  count: string = 'a'
  m(i: string): void {
    this.count = i;
  }
}

使用限制:

  • 不支持this类型
  • 不支持在函数和类的静态方法中使用this

示例

class A {
  n: number = 0
  f1(arg1: this) {} // 编译时错误,不支持this类型
  static f2(arg1: number) {
    this.n = arg1;  // 编译时错误,不支持在类的静态方法中使用this
  }
}

function foo(arg1: number) {
  this.n = i;       // 编译时错误,不支持在函数中使用this
}

关键字this的指向:

  • 调用实例方法的对象
  • 正在构造的对象

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

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

相关文章

Unity(2022.3.38LTS) - 变换组件和约束

目录 一. 变换组件 二. 约束 一. 变换组件 在 Unity 中&#xff0c;变换组件&#xff08;Transform Component&#xff09;是每个游戏对象都必备的组件&#xff0c;用于控制对象在场景中的位置、旋转和缩放。 位置&#xff08;Position&#xff09;&#xff1a; 表示对象在…

opencv-python实战项目十:二维码识别

文章目录 一&#xff1a;简介二&#xff1a;opencv二维码识别流程三&#xff1a;整体代码四&#xff1a;效果 一&#xff1a;简介 二维码识别是一种利用图像处理技术&#xff0c;从数字图像中提取并解析二维码信息的过程。该技术广泛应用于信息快速交换、移动支付、产品追踪等…

SpringCloud的能源管理系统-能源管理平台源码

介绍 基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 软件架构

MySQL的InnoDB存储引擎中的Buffer Pool机制

目录 Buffer Pool 简介 定义 为什么需要Buffer Pool 图解重点知识 Buffer Pool 的组成 数据页&#xff08;Data Pages&#xff09; 索引页&#xff08;Index Pages&#xff09; 插入缓冲页&#xff08;Insert Buffer Pages&#xff09; undo页&#xff08;Undo Pages&a…

idea鼠标悬浮显示注释

鼠标悬停在代码上的时候会出现快速文档&#xff0c;如下图&#xff0c;这里介绍下如何去除快速文档的显示 2020版本之前 依次找到 File—>Settings—>Editor—>General 去掉勾选 Show quick documentation on mouse move 2020版本之后 依次找到 File—>Settings…

Python数据可视化案例——地图

目录 简单案例&#xff1a; 进阶案例&#xff1a; 继上文数据可视化案例&#xff0c;今天学习用pyecharts练习数据可视化案例2-构建地图。 简单案例&#xff1a; 首先构建一个简单的地图。 代码&#xff1a; import json from pyecharts.charts import MapmapMap() data[…

什么反人类设计?

一、什么反人类设计&#xff1f; 反人类设计&#xff0c;也被称为“诺曼”&#xff0c;是由美国心理学家唐纳德A诺曼提出的概念&#xff0c;指的是那些设计不佳、不利于用户使用的物品。这类设计的特点通常包括不符合人体工学原理、与日常认知和惯性思维相悖。在日常生活中&…

OpenCV图像滤波(13)均值迁移滤波函数pyrMeanShiftFiltering()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 函数执行均值迁移图像分割的初始步骤。 该函数实现了均值迁移分割的过滤阶段&#xff0c;即输出是经过滤波的“海报化”图像&#xff0c;其中颜色…

Java 垃圾回收,看一遍就懂

了解 Java 垃圾收集的工作原理并优化应用程序中的内存使用情况。详细了解 Java 中内存管理的复杂性。 垃圾收集是一个关键过程&#xff0c;可以帮助任何Java 开发公司。编程语言中的这一强大功能可以巧妙地管理内存分配和释放&#xff0c;防止内存泄漏并优化资源利用率。它就像…

pytorch库 04 神经网络代码基础

文章目录 一、神经网络基本骨架 nn.Module二、卷积层三、池化层四、非线性激活层五、线性层六、模型搭建小练习&#xff1a;CIFAR 10 model 结构七、损失函数与反向传播八、优化器九、现有网络模型的使用与修改十、网络模型的保存与读取十一、一个完整模型训练套路十二、GPU加速…

arm体系结构(1)

一 RAM: 随机存储(主存储器) 速度快、掉电数据丢失 ROM: 只读存储(辅助存储器) 速度慢、掉电数据不丢失 RAM SRAM DRAM SDRAM DDR2、3、4、5 静态 动态 同步 ROM PROM EPROM EEPROM 可编程 可擦除 电可擦可编程 flash:结合RAM和ROM的优点&#xff0c;快、掉…

Visual Studio 2022 LNK2001无法解析的外部符号 _wcscat_s 问题记录

ANSI C程序中&#xff0c;用到了wcsrchr、wcsncpy_s、wcscat_s、wcscpy_s等几个字符串函数&#xff0c;但是编译时提示&#xff1a; 错误 LNK2001 无法解析的外部符号 _wcscat_s 查了挺多帖子&#xff0c;没有解决。 https://bbs.csdn.net/topics/250012844 解决VS编译…

Python青少年简明教程:为何学习Python编程语言及Python编程环境搭建

Python青少年简明教程&#xff1a;为何学习Python编程语言及Python编程环境搭建 我们写给他人看的文章&#xff0c;使用类语言。人类语言有很多种如汉语&#xff0c;英语&#xff0c;法语等等。 而写给 计算机 执行的 程序文件 &#xff0c;必须使用 编程语言 &#xff0c; 因…

Java 集成测试详解及示例

通过综合指南探索 Java 集成测试的世界。了解工具、流程和最佳实践&#xff0c;并辅以实际示例。 随着软件系统变得越来越大、越来越复杂&#xff0c;组件和服务以错综复杂的方式交互&#xff0c;集成测试已变得不可或缺。通过验证所有组件和模块在组合时是否正常工作&#xff…

三级_网络技术_27_计算机网络环境及应用系统的安装与调试

1.对于频繁改变位置并使用DHCP获取PP地址的DNS客户端&#xff0c;为减少对其资源记录的手动管理&#xff0c;可采取的措施是()。 允许动态更新 使用反向查找区域 增加别名记录 设置较小的生存时间 2.下列Windows 2003系统命令中&#xff0c;可以清空DNS缓存(DNScache)的是…

在Ubuntu上有什么命令,或者是系统文件能告诉我链接nvme ssd的pcie槽位是不是支持热插拔功能?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

打靶记录11——Billu_b0x

靶机&#xff1a; https://download.vulnhub.com/billu/Billu_b0x.zip难度&#xff1a; 中&#xff08;两种攻击路线&#xff09; 目标&#xff1a; 取得root权限 涉及的攻击方法&#xff1a; 主机发现端口扫描Web信息收集SQL注入&#xff08;Sqlmap跑不出来&#xff09;…

Spring Boot 3.3 【四】Spring Boot 整合JPA

&#x1f31f; 技术人聊管理 请关注 【技术管理修行】 一、JPA 简介 Spring Data JPA 是 Spring Data 项目的一部分&#xff0c;它为使用 Java Persistence API (JPA) 进行数据库访问提供了一种非常简便的方式。Spring Data JPA 的主要目的是简化基于 JPA 的数据访问层的开发工…

leetCode - - - 栈和队列

目录 1.有效的括号&#xff08; LeetCode 20 &#xff09; 2.最小栈&#xff08; LeetCode 155 &#xff09; 3.接雨水&#xff08; LeetCode 42 &#xff09; 4.逆波兰表达式求值&#xff08;LeetCode 150&#xff09; 5.柱状图中最大的矩形&#xff08;LeetCode 84&…

SAP LE学习笔记02 - WM和库存管理(IM)之间的关系,保管Lot(Quant)

上一章学习了LE的基础知识。 1&#xff0c;LE的概述&#xff0c;LE里面包含下面3个大的模块 - LE-WM 仓库管理 / - LE-SHP 发货/ - LE-TRA 运输 2&#xff0c;仓库的结构 - 仓库番号 / -保管域Type(存储区域)/ - 保管区画(存储区)/ - 棚番&#xff08;Storage Bin 仓位&…