初识arkts-类-接口
类
类声明引入一个新类型,并定义其字段、方法和构造函数。定义类后,可以使用关键字new创建实例可以使用对象字面量创建实例
export class Person{// 属性 必须要给初始值firstName:string=''lastName:string=''//构造函数:给属性初始值,初始化属性// constructor(){// console.log('无参函数')// }constructor( firstName:string,lastName:string) {this.firstName=firstNamethis.lastName=lastName}fullName(){return this.lastName+this.firstName}
}
let p:Person=new Person('','')
实例字段
class Person2{firstName:string=''lastName:string=''// 不能有构造函数/函数
}
静态
static将字段声明为静态
访问静态字段,需要使用类名
//静态字段static firstName:string=''
//静态函数
static a(num1:number,num2:number){Person3.firstName='江户时代'//不支持this,无法直接访问非静态字段/函数return num1+num2
}
//静态字段使用类名进行访问
Person3.firstName='hj'
方法
方法属于类。类可以定义实例方法或者静态方法。静态方法属于类本身,只能访问静态字段。而实例方法既可以访问静态字段,也可以访问实例字段,包括类的私有字段。
继承
一个类可以继承另一个类(称为基类),并使用以下语法实现多个接口继承类继承基类的字段和方法,但不继承构造函数。继承类可以新增定义字段和方法,也可以覆盖其基类定义的方法。基类也称为“父类”或“超类”。继承类也称为“派生类”或“子类”。包含implements子句的类必须实现列出的接口中定义的所有方法,但使用默认实现定义的方法除外
父类访问关键字super可用于访问父类的实例字段、实例方法和构造函数。在实现子类功能时,可以通过该关键字从父类中获取所需接口
//父类
class pet{name:string=''sex:string=''
static age:number=0constructor(name:string,sex:string) {this.name=namethis.sex=sex}show(){return`昵称:${this.name},姓名:${this.sex}`}
}
//子类
lass Dog extends pet{// 必须调用父类有参的构造函数constructor(name:string,sex:string) {super(name,sex)}name: string=''type:string=''//重写:子类重写父类函数//1.方法名相同 2.参数类型相同 3.返回值类型相同或是其子类show(){return`昵称:${this.name},姓名:${this.sex}`}
方法重写与重载
子类可以重写其父类中定义的方法的实现。重写的方法必须具有与原始方法相同的参数类型和相同或派生的返回类型。通过重载签名,指定方法的不同调用。具体方法为,为同一个方法写入多个同名但签名不同的方法头,方法实现紧随其后,如果两个重载签名的名称和参数列表均相同,则为错误
可见性修饰符类的方法和属性都可以使用可见性修饰符。
Public(公有)public修饰的类成员(字段、方法、构造函数)在程序的任何可访问该类的地方都是可见的
Private(私有)private修饰的成员不能在声明该成员的类之外访问
Protected(受保护)protected修饰符的作用与private修饰符非常相似,不同点是protected修饰的成员允许在派生类中访问
class Aa{//共有的public a1:string=''//受保护的:本类和子类中使用protected a2:string=''//私有的private a3:string=''
}
Record类型的对象字面量
泛型Record<K, V>用于将类型(键类型)的属性映射到另一个类型(值类型)。常用对象字面量来初始化该类型的值
类型K可以是字符串类型或数值类型,而V可以是任何类型
class Stu{name:string=''age:number=0
}
let map2:Record<string,Stu>={'张三':{name:'张三',age:18},'张4':{name:'张4',age:18},'张5':{name:'张5',age:18},'张6':{name:'张6',age:18},'张7':{name:'张7',age:18},'张8':{name:'张8',age:18}
}
let s:Stu=map2['']
接口
接口声明引入新类型。接口是定义代码协定的常见方式。任何一个类的实例只要实现了特定接口,就可以通过该接口实现多态。接口通常包含属性和方法的声明
interface Stus{//接口中的方法,没有方法体(方法的实现)eat():voidstudy():number
}
接口属性
接口属性可以是字段、getter、setter或getter和setter组合的形式。属性字段只是getter/setter对的便捷写法
接口继承
接口可以继承其他接口,继承接口包含被继承接口的所有属性和方法,还可以添加自己的属性和方法。继承关键字extends
interface Stu2{name:stringsex:stringeat():voidstudy():number
}
class Stu3 implements Stu2{//接口的属性会在实现类中默认隐式生成getter/settername: string=''sex: string=''eat(): void {throw new Error('Method not implemented.')}study(): number {throw new Error('Method not implemented.')}}
let stu3=new Stu3();
stu3.name='123'
interface A1{a():void
}
interface B1{b():void
}
//实现多个接口
class C1 implements A1,B1{b(): void {throw new Error('Method not implemented.')}a(): void {throw new Error('Method not implemented.')}
多态的实现方法,同一个方法在不同条件得到不同的结果
继承中的多态
class Pet{name:string=''play():void{console.log('')}
}
class Dog extends Pet{play():void{console.log('狗吃')}
}
class Cat extends Pet{play():void{console.log('猫网')}
}