Arkts 类

  • 类声明引入一个新类型,并定义其字段,方法和构造函数
  • 定义类后,可以使用关键字new创建实例
  • 可以使用对象字面量创建实例
  • 在以下示例中,定义了Person类,该类具有字段name和surname、构造函数和方法fullName
  • 在这里插入图片描述

字段

  1. 字段是直接在类中声明的某种类型的变量

  2. 类可以具有实例字段或者静态字段

    实例字段

  3. 实例字段存在于类的每个实例上。每个实例都有自己的实例字段集合。

  4. 要访问实例字段,需要使用类的实例。
    在这里插入图片描述
    静态字段

  5. 使用关键字static将字段声明为静态。静态字段属于类本身,类的所有实例共享一个静态字段。

  6. 要访问静态字段,需要使用类名

    export class Person3 {
      //  静态字段 static
      static firstName: string = ''
      lastName: string = ''
    
      //   静态函数
      //   不支持this
      //   无法直接访问非静态字段/函数
      static a(num1: number, num2: number) {
        Person3.firstName = '张三'
        return num1 + num2
      }
    }
    
    // 静态字段使用类名进行访问
    Person3.firstName = 'ss'
    
字段的初始化
  1. 为了减少运行时的错误和获得更好的执行性能,
  2. ArkTS要求所有字段在声明时或者构造函数中显式初始化。这和标准TS中的strictPropertyInitialization模式一样。
方法

方法属于类。类可以定义实例方法或者静态方法。静态方法属于类本身,只能访问静态字段。而实例方法既可以访问静态字段,也可以访问实例字段,包括类的私有字段。
在这里插入图片描述

静态方法
  1. 使用关键字static将方法声明为静态。静态方法属于类本身,只能访问静态字段
  2. 静态方法定义了类作为一个整体的公共行为。
  3. 必须通过类名调用静态方法
    在这里插入图片描述

继承

  1. 一个类可以继承另一个类(称为基类),并使用以下语法实现多个接口
    在这里插入图片描述

  2. 继承类继承基类的字段和方法,但不继承构造函数。继承类可以新增定义字段和方法,也可以覆盖其基类定义的方法。

  3. 基类也称为“父类”或“超类”。继承类也称为“派生类”或“子类”。

  4. 包含implements子句的类必须实现列出的接口中定义的所有方法,但使用默认实现定义的方法除外

父类访问

关键字super可用于访问父类的实例字段、实例方法和构造函数。在实现子类功能时,可以通过该关键字从父类中获取所需接口

方法的重写与重载
  1. 子类可以重写其父类中定义的方法的实现。重写的方法必须具有与原始方法相同的参数类型和相同或派生的返回类型。

    // 重写:子类重写父类的函数
    // 1.方法名相同
    // 2.参数类型相同
    // 3.返回值类型相同或是其子类
    
  2. 通过重载签名,指定方法的不同调用。具体方法为,为同一个方法写入多个同名但签名不同的方法头,方法实现紧随其后,如果两个重载签名的名称和参数列表均相同,则为错误

    class Over {
      //重载
      aa(x: number): void;
      aa(x: string): void;
      aa(x: number | string): void {
      }
    }
    
    class Oo extends Over {
      aa(x: number): void;
      aa(x: string): void;
      aa(x: number | string): void {
      }
    }
    
构造函数
  1. 类声明可以包含用于初始化对象状态的构造函数
    在这里插入图片描述

  2. 如果未定义构造函数,则会自动创建具有空参数列表的默认构造函数
    在这里插入图片描述

  3. 在这种情况下,默认构造函数使用字段类型的默认值来初始化实例中的字段

派生类的构造函数

构造函数函数体的第一条语句可以使用关键字super来显式调用直接父类的构造函数
在这里插入图片描述

构造函数重载签名
  1. 我们可以通过编写重载签名,指定构造函数的不同调用方式。具体方法为,为同一个构造函数写入多个同名但签名不同的构造函数头,构造函数实现紧随其后。

在这里插入图片描述
2. 如果两个重载签名的名称和参数列表均相同,则为错误。

可见性修饰符
  1. 类的方法和属性都可以使用可见性修饰符。

  2. Public(公有)

    public修饰的类成员(字段、方法、构造函数)在程序的任何可访问该类的地方都是可见的。

  3. Private(私有)

    private修饰的成员不能在声明该成员的类之外访问

  4. Protected(受保护)

    protected修饰符的作用与private修饰符非常相似,不同点是protected修饰的成员允许在派生类中访问

  5. getter和setter

​ setter和getter可用于提供对对象属性的受控访问

对象的字面量
  1. 对象字面量是一个表达式,可用于创建类实例并提供一些初始值。它在某些情况下更方便,可以用来代替new表达式。
  2. 对象字面量的表示方式是:封闭在花括号对({})中的’属性名:值’的列表
  3. 对象字面量只能在可以推导出该字面量类型的上下文中使用
  4. 也可以在数组元素类型或类字段类型中使用
Record类型的对象字面量

泛型Record<K, V>用于将类型(键类型)的属性映射到另一个类型(值类型)。常用对象字面量来初始化该类型的值

类型K可以是字符串类型或数值类型,而V可以是任何类型

接口

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

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

    interface Stus{
      eat():void
      study():number
    }
    //(实现类)实现接口必须重写接口中的方法
    class Stu1 implements Stus{
      eat(): void {
        console.log('学生在吃')
      }
    
      study(): number {
        console.log('学生在学习')
        return 100
      }
    }
    

​ 3.接口通常包含属性和方法的声明
在这里插入图片描述

接口属性

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

interface Stu2{
    // 接口的属性在实现类中默认隐式的生		              getter/setter方法
  name:string
  sex:string
  eat():void
  study():number
}

属性字段只是getter/setter对的便捷写法
在这里插入图片描述
在这里插入图片描述

实现接口的类也可以使用以下两种方式
在这里插入图片描述
在这里插入图片描述

接口继承
  1. 接口可以继承其他接口
    在这里插入图片描述

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

  3. 继承关键字extends

继承中的多态

多态的实现方法,同方一个方法在不同的条件得到不同的结果

class Pet {
  name: string = ''

  play(): void {
    console.log('玩耍')
  }
}

class Dog extends Pet {
  play(): void {
    console.log('狗玩皮球')
  }
}

class Cat extends Pet {
  play(): void {
    console.log('猫玩狗')
  }
}

1.以父类作为形参

function play(pet: Pet) {
  pet.play()
}

play(new Cat())
play(new Dog())

2.以父类作为返回值

function ly(): Pet {
  let num = Math.random() * 10
  if (num > 5) {
    return new Dog()
  } else {
    return new Cat()
  }
}

接口实现的多态和继承实现的多态没有区别

泛型

泛型类型和函数
  1. 泛型类型和函数允许创建的代码在各种类型上运行,而不仅支持单一类型。
  2. 泛型类和接口
    • 类和接口可以定义为泛型,将参数添加到类型定义中,如以下示例中的类型参数Element:
      在这里插入图片描述

    • 要使用类型CustomStack,必须为每个类型参数指定类型实参:
      在这里插入图片描述

    • 编译器在使用泛型类型和函数时会确保类型安全。参见以下示例:
      在这里插入图片描述

通配符
  1. 泛型中通配符
  2. 我们在定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,比如 T,E,K,V 等等,这些通配符又都是什么意思呢?
  3. 常用的 T,E,K,V,?
  4. 本质上这些个都是通配符,没啥区别,只不过是编码时的一种约定俗成的东西。比如上述代码中的 T ,我们可以换成 A-Z 之间的任何一个 字母都可以,并不会影响程序的正常运行,但是如果换成其他的字母代替 T ,在可读性上可能会弱一些。通常情况下,T,E,K,V,?是这样约定的:
    • ?表示不确定的 类型
    • T (type) 表示具体的一个类
    • K V (key value) 分别代表键值中的Key Value
    • E (element) 代表Element
    • ?无界通配符
泛型函数
  1. 使用泛型函数可编写更通用的代码。比如返回数组最后一个元素的函数:
    在这里插入图片描述

  2. 如果需要为任何数组定义相同的函数,使用类型参数将该函数定义为泛型:
    在这里插入图片描述

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

  4. 在函数调用中,类型实参可以显式或隐式设置
    在这里插入图片描述

泛型默认值

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

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐