自学内容网 自学内容网

初识arkts2

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

属性 必须要给初始值

constructor():构造函数

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

export class PersonStudent{
  firstName:string=''//名
  lastName:string=''//姓
  //constructor():构造函数:给属性初始值,初始化属性
  // constructor() {
  //   console.log('无参函数')
  // }
  constructor(firstName:string='',lastName:string='') {
    this.firstName=firstName
    this.lastName=lastName
  }
  //函数,不能写function
  fullName(){
    //this调用自己的属性
    return this.lastName+this.firstName
  }
}
字段

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

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

实例字段

要访问实例函数,需要使用类的实例

//实例字段
let p:PersonStudent=new PersonStudent('z','s')
//实例字段,通过new对象之后进行访问的字段
p.firstName='啧啧啧';
静态函数

使用关键字static将字段声明为静态。

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

构造函数不允许使用静态字段

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

  // static constructor() {
  // }
}
静态函数

不支持this,无法直接访问非静态字段/函数

静态字段使用类名进行访问

class person3{
  a2(){

  }
  a3(){
    this.a2()
  }
  //静态函数
  static a(num1:number,num2:number){
    person3.firstName='张三'
    //不支持this,无法直接访问非静态字段/函数
    // this.lastName='aa'
    //无法直接访问函数
    // a2();
    return num1+num2
  }
}
//不用new对象进行访问
person3.firstName='ss'
//静态访问a()
person3.a(1,2)
继承

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

继承extends

子类 只支持单继承(只能继承一个父类)

必须调用父类的有参的构造函数,构造函数必须调用,但不能继承

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

//父类
class Pet{
  name:string=''
  sex:string=''
  static age:number=0
  constructor(name:string,sex:string) {
    this.name=name
    this.sex=sex
    //不能使用静态 static age:number=0
  }
  //函数
  show(){
    return `昵称:${this.name},性别:${this.sex}`
  }
}
//子类
class Dog extends Pet{
  constructor(name:string,sex:string) {
    //关键词:super
    super(name,sex)
  }
  //子类自己的属性
  type:string=''
    //重写
  show(){
    //方法不一样,结果一样
    return super.show()+'品种:'+this.type
    // return `昵称:${this.name},性别:${this.sex},品种:${this.type}`
  }
  a(){
    this.show()//子类
    super.show()//父类
  }
}
let pe=new Pet('张三','男')
//当子类的函数和父类的函数重名,会调用子类的函数
pe.show()
重写

子类重写父类的函数

要求:1.方法名相同

2.参数类型相同

3.返回值类型相同,或者其子类

show(){
    return super.show()+'品种:'+this.type
     return `昵称:${this.name},性别:${this.sex},品种:${this.type}`
  }
重载

同一个类中,方法名相同,参数列表不同,返回值类型相同

class Over{
  //重载
  aa(x:number):void
  aa(x:string,k:number):void
  aa(x:number|string,k?:number):void{
  }
}
class Oo extends  Over{
  aa(x:number):void
  aa(x:string):void
  aa(x:number|string):void{

  }
}
可见性修饰符

public修饰的类成员在程序的任何可访问该类的地方都是可见的

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

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

class Aa{
  //public:共有的
  public  a1:string=''
  // protected 受保护的:本类和子类中使用
  protected  a2:string=''
  //private私有的
  private a3:string=''

}
class Bb extends  Aa{
  show(){
    this.a2='asd'
  }
}
let aa=new Aa()
let bb=new Bb()
aa.a1;

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

//可见性修饰
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 get a2(): string {
    return this._a2
  }

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

}
let p1=new pri('1','2');
p1.a1='a'
Record类型的对象字面量

泛型Record<k,v> 键值对

let map:Record<string,string>={
  'name':'张三',
  'sex':'男',
  'color':'黄'
}
let names=map['name'];
class Stu{
  name:string=''
  age:number=0
}
//Record 存数据,键值对数据
let map2:Record<string,Stu>={
  '张三':{name:'张三',age:18},
  '李四':{name:'李四',age:18},
  '李五':{name:'李五',age:18},
  '李六':{name:'李六',age:18},
  '李其':{name:'李其',age:18},
}
let s:Stu=map2['张三'];

接口

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

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

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

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

接口的属性会在实现类中默认隐式生成getter/setter方法

interface  Stu2{
  name:string
  sex:string
  eat():void
  study():number
}
class Stu3 implements Stu2{
  name: 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 Inte1{
  a():void
}
interface  Inte2 extends Inte1{
  b():void
}
class Imp1 implements Inte2{
  b(): void {
    throw new Error('Method not implemented.')
  }

  a(): void {
    throw new Error('Method not implemented.')
  }
}

实现多个接口

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('猫玩狗')
  }
}
// 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()
  }
}
泛型

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

泛型的通配符

泛型 T:type类,

K:key ,

V:value,

E:element集合,

N:number

?:不确定的类型

class Fx<E>{
  a(e:E):void{
    console.log(`${e}`)
  }
}
let fx=new Fx<number[]>();
fx.a([1,2])
泛型函数
//返回数字数组的最后一个元素
function lastGet(x:number[]):number{
  return x[x.length-1]
}
//调用
let aa=lastGet([1,2,3,4])
//返回任意类型数组的最后一个元素
function getLast<T>(x:T[]):T{
  return x[x.length-1]
}
//调用
let a2=getLast<string>(['1','2','as'])

原文地址:https://blog.csdn.net/syj_111/article/details/143893881

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