自学内容网 自学内容网

初始ArKTs 2

一.类

1.1 声明

类声明引入一个新类型,并定义其字段、方法和构造函数。

定义类后,可以使用关键字new创建实例 可以使用对象字面量创建实例

在以下示例中,定义了Person类,该类具有字段firstname和lastname、构造函数和方法fullName

//创建对象
export  class  Person{
  // 属性  必须要有初始值
  firstName:string=''
  lastName:string=''
  //构造函数:给属性初始值,初始化属性(可加可不加)
  // constructor() {
  //   console.log('无参函数')
  // }

  constructor(  firstName:string,lastName:string) {
    this.firstName = firstName
    this.lastName = lastName
  }
  fullName(){
    return this.lastName+this.firstName
  }
}
class Person2{
  firstName:string=''
  lastName:string=''
  //不能有构造函数和函数,只能有普通属性,赋值用:不用=
  // constructor(  firstName:string,lastName:string) {
  //   this.firstName = firstName
  //   this.lastName = lastName
  // }
  //不能有函数
  // fullName(){
  //   return this.lastName+this.firstName
  // }
}
//字面量创建对象
let pp:Person2={ firstName: '六', lastName: '王'}

1.2字段

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

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

1.2.1 实例字段

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

要访问实例字段,需要使用类的实例。

let p:Person=new Person('z','s')
//实例字段,通过new对象之后进行访问的字段
p.firstName='几十块';
1.2.2 静态字段

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

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

xport  class  Person3{
  //静态字段
  static firstName:string=''
  lastName:string=''

1.3 字段初始化

为了减少运行时的错误和获得更好的执行性能,

ArkTS要求所有字段在声明时或者构造函数中显式初始化。这和标准TS中的strictPropertyInitialization模式一样。

 

1.4 方法

方法属于类。类可以定义实例方法或者静态方法。静态方法属于类本身,只能访问静态字段。而实例方法既可以访问静态字段,也可以访问实例字段,包括类的私有字段

 1.4.1 静态方法

使用关键字static将方法声明为静态。静态方法属于类本身,只能访问静态字段

静态方法定义了类作为一个整体的公共行为。

必须通过类名调用静态方法

  //静态函数
  static  a(){
    Person3.firstName='张三'
    //不支持this,无法直接访问非静态字段和函数
      // this,lastName='aa'
  }
}

1.5 继承

一个类可以继承另一个类(称为基类),并使用以下语法实现多个接口

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

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

1.5.1 父类访问

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

//宠物  父类,基类,超类
class  Pet{
  name:string=''
  sex:string=''
  static  age:number=0

  constructor(name:string,sex:string) {
    this.name=name
    this.sex=sex
  }
  show(){
    return`昵称:${this.name},性别:${this.sex}`
  }
}
//子类 只支持单继承
class DOg extends Pet{
  //必须调用父类的有参的构造函数,不能继承
  constructor(name:string,sex:string) {
    //super 调用父类的构造函数
   super(name,sex)
  }

1.6 方法重写与重载

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

通过重载签名,指定方法的不同调用。具体方法为,为同一个方法写入多个同名但签名不同的方法头,方法实现紧随其后,如果两个重载签名的名称和参数列表均相同,则为错误

  type:string=''
  //重写:子类重写父类的函数
  //要求:1.方法名相同2.参数类型相同3.返回值类型相同或是其子类
  show(){
    return super.show()+'品种'+this.type
  }
  //默认调用子类
  a(){
    this.show()//子类
    super.show()//父类
  }
  //方法的重载:1.同一类中,方法名相同,参数列表不同,返回值类型相同
  //arkts不支持重载
  // shows(a:number){
  //
  // }
  // shows(a:number){
  //
  // }
class  Over{
  //重载
  // aa(x:number):void
  // aa(x:string):void
  aa(x:number|string):void{

  }
}

1.7构造函数

类声明可以包含用于初始化对象状态的构造函数

如果未定义构造函数,则会自动创建具有空参数列表的默认构造函数

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

class  Pri{
  private _a1: string

  public set a1(value: string) {
    this._a1 = value
  }

  public get a1(): string {
    return this._a1
  }

  private _a2: string

  public set a2(value: string) {
    this._a2 = value
  }

  public geta2(): string {
    return this._a2
  }

  constructor(a1: string, a2: string) {
    this._a1 = a1
    this._a2 = a2
  }

}

let p1=new Pri('1','2');
p1.a1='a'

 1. 8可见性修饰符

public(公有)

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

private(私有)

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

protected(受保护)

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

class Aa{
  //共有的
  public a1:string=''
  //受保护的:本类和子类中使用
  protected  a2:string=''
  //私有的
  private  a3:string=''
}
class  Bb extends  Aa{
  show(){
    this.a2='asd'
  }

}
let aa=new Aa();
let bb=new Bb()

getter和setter

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

1.9 对象字面量

对象字面量是一个表达式,可用于创建类实例并提供一些初始值.他在某些情况下更方便,可以用来代替new表达式

对象字面量的表达方式是:封闭在花括号对({})中的'属性名:值'的列表

class C{
n:number=0
s;string=''
}

let c:C={n:42,S:'foo'}

对象字面量只能在推导出该字面量类型的上下文中使用

也可以在数组元素类型或字段类型中使用

1.10Record类型的对象字面量

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

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

二.接口

2.1接口

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

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

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

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

  study(): number {
    console.log('学生在学习')
    return 100
  }

}

2.2接口属性

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

属性字段只是getter/setter对的便捷写法

              

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

 

 


原文地址:https://blog.csdn.net/2402_86272660/article/details/143888818

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!