接口的使用

一 .接口

1.接口关键字:interface :规定类必须具有的功能

interface A{
    //接口没有构造函数
    num1:number
    //接口中的方法不能有方法体,必须写上返回值类型
    a1():void
}
 
//接口不能被实例化
//let a:A=new A() //报错

 接口的总结:1.接口没有构造函数, 2.接口中的方法不能有方法体,必须写上返回值类型,

3.接口不能被实例化。

2.实现类

实现类的概念: 必须有接口中的属性,必须重写接口中的方法。

使用接口需要使用implements关键字

implements:实现接口

//实现小电风扇插入USB接口,可以调节风扇速度,拔出usb接口则停止工作
 
//创建Usb接口
 
interface Usb{
    in():void;
    outs():void;
}
 
// implements 实现接口
class Fs implements Usb{
    type:string
    ts(){
        console.log('调节风扇速度');
    }
    constructor(type:string){
        this.type=type
    }
    in():void{
        console.log('风扇插入usb');
    }
    outs():void{
        console.log('风扇拔出usb');
    }
}
//子类只能继承一个父类,但是可以有多个接口。

练习:

1.组装成一个电脑 

2.计算机有品牌 型号属性   

3.cpu 有cpu的品牌,主频 ,介绍 

4.硬盘 有容量 介绍

5.内存 有 容量 介绍

//创建了一个电脑类 有品牌 型号属性
class Comp{
    brand:string
    type:string
    constructor(brand:string,type:string){
        this.brand=brand
        this.type=type
    }
    info(){
        console.log(`${this.brand}电脑品牌:${this.type}型号`);
    }
}
 
//创建了一个CPU的接口
interface Cpu{
   cpu(brand:string,zp:string):void
}
 
//创建了一个硬盘的接口
interface Yp{
    yp(rl:string):void
 }
 
//创建了一个内存的接口
 interface Nc{
    nc(rl:string):void
 }
 
//我们开始组装我们的电脑 继承了电脑的类,连接了CPU,硬盘,内存的接口
 class Cp extends Comp implements Cpu,Yp,Nc{
    constructor(brand:string,type:string){
        super(brand,type)
    }
    cpu(brand:string,zp:string):void{
        console.log(`CPU的品牌是:${brand},主频是:${zp}`);
    }
    yp(rl: string): void {
        console.log(`硬盘的容量是:${rl}`);
        
    }
    nc(rl: string): void {
        console.log(`内存容量是:${rl}`);
        
    }
 }
//实例化对象
 let c1:Cp=new Cp('联想','小星')
 c1.info()
 c1.cpu('Inter','3.8GHz')
 c1.yp('3000GB')
 c1.nc('4GB')

二. 多态的实例

1.功能介绍:影音管理系统

实现功能有:把数据添加到页面中添加音频或视频 删除存入的数据

2.需要准备的数据

1.在ets文件夹中创建一个model文件夹,在model文件夹中放入我们所写的TS代码,并导出出来。

2.还要一个Videos.ts(视频)文件 ,Audio.ts(音频文件),Medias(媒体文件)

3.medias文件是 视频和音频文件的共同属性,里面有name(名称)属性, size(大小)属性,show(介绍)属性,times(时长)属性。

我们需要把我们所需的属性和方法都要封装 我们用标识符 Private 私有属性,只能在本类中使用,我们还需要export关键字导出文件。

//媒体
export class Medias{
  private _name: string
 
  public set name(value: string) {
    this._name = value
  }
 
  public get name(): string {
    return this._name
  }
 
  private _size: number
 
  public set size(value: number) {
    this._size = value
  }
 
  public get size(): number {
    return this._size
  }
 
  private _show: string
 
  public set show(value: string) {
    this._show = value
  }
 
  public get show(): string {
    return this._show
  }
 
  private _times: number
 
  public set times(value: number) {
    this._times = value
  }
 
  public get times(): number {
    return this._times
  }
 
  constructor(name:string,size:number,show:string,times:number) {
    this._name=name
    this._size=size
    this._show=show
    this._times=times
  }
 
}
 

我们创建很多属性方法,还要封装,初始化,当设置私有属性还需要get和set,这是我们可以右键找到Generate,点击进去

显示这个页面,选择Getter and Setter就自动帮我们生成好代码了

Audio.ts类继承Medias类

// 音频: 名字 大小 简介 作曲 作词 原唱 翻唱 时长
import { Medias } from './Medias';
 
export  class Audio extends Medias{
  private _zq: string;
 
  public set zq(value: string) {
    this._zq = value;
  }
 
  public get zq(): string {
    return this._zq;
  }
 
  private _zc: string;
 
  public set zc(value: string) {
    this._zc = value;
  }
 
  public get zc(): string {
    return this._zc;
  }
 
  private _yc: string;
 
  public set yc(value: string) {
    this._yc = value;
  }
 
  public get yc(): string {
    return this._yc;
  }
 
  constructor(name: string, size: number, show: string, times: number, zq: string, zc: string, yc: string, fc: string) {
    super(name, size, show, times);
    this._zq = zq;
    this._zc = zc;
    this._yc = yc;
    this._fc = fc;
  }
 
  private _fc: string;
 
  public set fc(value: string) {
    this._fc = value;
  }
 
  public get fc(): string {
    return this._fc;
  }
}

Videos.ts类继承Medias类

// 视频: 名字 大小 简介 时长 类型 主演 画质 导演 制片人
import { Medias } from './Medias';
 
export class Videos extends  Medias{
  private _type: string;
 
  public set type(value: string) {
    this._type = value;
  }
 
  public get type(): string {
    return this._type;
  }
 
  private _zy: string;
 
  public set zy(value: string) {
    this._zy = value;
  }
 
  public get zy(): string {
    return this._zy;
  }
 
  private _hz: string;
 
  public set hz(value: string) {
    this._hz = value;
  }
 
  public get hz(): string {
    return this._hz;
  }
 
  private _dy: string;
 
  public set dy(value: string) {
    this._dy = value;
  }
 
  public get dy(): string {
    return this._dy;
  }
 
  private _zpr: string;
 
  public set zpr(value: string) {
    this._zpr = value;
  }
 
  public get zpr(): string {
    return this._zpr;
  }
 
  constructor(name: string, size: number, show: string, times: number, type: string, zy: string, hz: string, dy: string,
    zpr: string) {
    super(name, size, show, times);
    this._type = type;
    this._zy = zy;
    this._hz = hz;
    this._dy = dy;
    this._zpr = zpr;
  }
}

3.主程序

我们创建了一个medias数组用于存储我们数据,md实例化Medias  isAorV是判断当前是音频还是视频后续会介绍到  ad,vd是音频和视频的实例化

aboutToAppear:生命周期,即打开页面就运行里面代码

声明数据内容没有任何意义,仅作为练习

 @State message: string = '影音管理系统';
  @State medias: Medias[]=[]
  @State md:Medias=new Medias('',0,'',0)
  @State ad:Audio=new Audio('',0,'',0,'','','','')
  @State vd:Videos =new Videos('',0,'',0,'','','','','')
  @State isAorV:boolean=false//默认是音频
  aboutToAppear(): void {
    this.medias.push(new Videos('《JoJo的奇妙冒险》幻影之血',100,'讲述了一个外来人来争夺家产的故事',26,'命运','乔纳森·乔斯达','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('ジョジョ~その血の运命~',100,'无',3,'田中公平','藤林聖子','Hiroaki Tommy Tominaga','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》战斗潮流',100,'讲述了主角团们对抗一群超越人类的生物',26,'命运','乔瑟夫·乔斯达','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('BLOODY STREAM',100,'无',3,'无','无','无','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》星尘斗士',100,'从祖父开始的命运开始了',26,'命运','空条承太郎','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('ジョジョ その血の记忆 ~ end of THE WORLD ~ ',100,'无',3,'无','无','无','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》不灭钻石',100,'讲述了一场外遇开始牵扯出一堆事件的故事',26,'命运','东方仗助','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('Crazy Noisy Bizarre Town',100,'无',3,'无','无','无','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》黄金之风',100,'讲述了在曾经的战斗中死了一个反派,突然有一天发现了他还有一个儿子,从开始的调查的视角到主角的视角面对各种挑战的故事。',26,'命运','乔鲁诺·乔巴纳','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('Crazy Noisy Bizarre Town',100,'无',3,'无','无','无','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》石之海',100,'讲述了在曾经的战斗中死了一个反派,他的挚友发现了他的死亡,并且得知内本能登上天堂的书,被主角团烧毁,开始密谋计划的故事',26,'命运','空条徐伦','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('Heaven’s falling down',100,'无',3,'无','无','无','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》飙马野郎',100,'讲述了一场世纪大赛「SBR」于美国举行,全长共6000公里,为了拿下高达5千万美元(60亿日元)的冠军奖金,一群强悍的冒险家们正式展开了他们的争战!',36,'命运','乔尼·乔斯达','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('无',0,'无',0,'无','无','无','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》乔乔福音',100,'未知',26,'命运','东方定助','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('无',0,'无',0,'无','无','无','互联网上无'))
  }

循环数组中数据

在ListItem中添加swipeAction组件实现删除功能,前提需要自定义删除组件

@Builder DelButton(index:number){
    Button('删除')
      .type(ButtonType.Normal)
      .width('20%')
      .height(150)
      .onClick(() => {
         this.medias.splice(index,1)
    })
  }
 Column(){
      Text(this.message).fontSize(30)
      List({space:10}){
        ForEach(this.medias,(md:Medias,index)=>{
          ListItem(){
            if(md instanceof Audio){ //音频
              Column(){
                Row(){
                  // 音频: 名字 大小 简介 时长 作曲 作词 原唱 翻唱
                  Text(`歌名:${md.name}`)
                  Text(`大小:${md.size}`)
                  Text(`时长:${md.times}`)
                }.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween)
                Row(){
                  Text(`作词:${md.zq}`)
                  Text(`作词:${md.zc}`)
                  Text(`原唱:${md.yc}`)
                  Text(`翻唱:${md.fc}`)
                }.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween)
                Row(){
                  Text(`简介:${md.show}`)
                }.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween)
              }.width('100%')
              .backgroundColor('#ccc')
            }else if(md instanceof Videos){ //视频
              Column(){
                Row(){
                  // 视频: 名字 大小 简介 时长 类型 主演 画质 导演 制片人
                  Text(`视频名:${md.name}`)
                  Text(`大小:${md.size}`)
                  Text(`时长:${md.times}`)
                  Text(`类型:${md.type}`)
 
                }.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween)
                Row(){
                  Text(`导演:${md.dy}`)
                  Text(`主演:${md.zy}`)
                  Text(`画质:${md.hz}`)
                  Text(`制片人:${md.zpr}`)
                }.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween)
                Row(){
                  Text(`简介:${md.show}`)
                }.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween)
              }.width('100%')
              .backgroundColor('#aaa')
 
            }
          }
          .swipeAction({
            end:this.DelButton(index)
          })
        })
      }.height(400).width('90%')

主程序的完整代码

import { Audio } from '../model/Audio';
import { Medias } from '../model/Medias';
import { Videos } from '../model/Videos';
import { promptAction } from '@kit.ArkUI';


@Entry
@Component
struct MediaPage {
  @State message: string = '影音管理系统';
  @State medias: Medias[]=[]
  @State md:Medias=new Medias('',0,'',0)
  @State ad:Audio=new Audio('',0,'',0,'','','','')
  @State vd:Videos =new Videos('',0,'',0,'','','','','')
  @State isAorV:boolean=false//默认是音频
  aboutToAppear(): void {
    this.medias.push(new Videos('《JoJo的奇妙冒险》幻影之血',100,'讲述了一个外来人来争夺家产的故事',26,'命运','乔纳森·乔斯达','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('ジョジョ~その血の运命~',100,'无',3,'田中公平','藤林聖子','Hiroaki Tommy Tominaga','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》战斗潮流',100,'讲述了主角团们对抗一群超越人类的生物',26,'命运','乔瑟夫·乔斯达','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('BLOODY STREAM',100,'无',3,'无','无','无','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》星尘斗士',100,'从祖父开始的命运开始了',26,'命运','空条承太郎','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('ジョジョ その血の记忆 ~ end of THE WORLD ~ ',100,'无',3,'无','无','无','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》不灭钻石',100,'讲述了一场外遇开始牵扯出一堆事件的故事',26,'命运','东方仗助','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('Crazy Noisy Bizarre Town',100,'无',3,'无','无','无','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》黄金之风',100,'讲述了在曾经的战斗中死了一个反派,突然有一天发现了他还有一个儿子,从开始的调查的视角到主角的视角面对各种挑战的故事。',26,'命运','乔鲁诺·乔巴纳','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('Crazy Noisy Bizarre Town',100,'无',3,'无','无','无','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》石之海',100,'讲述了在曾经的战斗中死了一个反派,他的挚友发现了他的死亡,并且得知内本能登上天堂的书,被主角团烧毁,开始密谋计划的故事',26,'命运','空条徐伦','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('Heaven’s falling down',100,'无',3,'无','无','无','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》飙马野郎',100,'讲述了一场世纪大赛「SBR」于美国举行,全长共6000公里,为了拿下高达5千万美元(60亿日元)的冠军奖金,一群强悍的冒险家们正式展开了他们的争战!',36,'命运','乔尼·乔斯达','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('无',0,'无',0,'无','无','无','互联网上有'))
    this.medias.push(new Videos('《JoJo的奇妙冒险》天堂福音',100,'未知',26,'命运','未知','4K','荒木飞吕彦','荒木飞吕彦'))
    this.medias.push(new Audio('无',0,'无',0,'无','无','无','互联网上无'))
  }
  build() {
    Column(){
      Text(this.message).fontSize(30)
      List({space:10}){
        ForEach(this.medias,(md:Medias,index)=>{
          ListItem(){
            if(md instanceof Audio){ //音频
              Column(){
                Row(){
                  // 音频: 名字 大小 简介 时长 作曲 作词 原唱 翻唱
                  Text(`歌名:${md.name}`)
                  Text(`大小:${md.size}`)
                  Text(`时长:${md.times}`)
                }.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween)
                Row(){
                  Text(`作词:${md.zp}`)
                  Text(`作词:${md.zc}`)
                  Text(`原唱:${md.yc}`)
                  Text(`翻唱:${md.fc}`)
                }.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween)
                Row(){
                  Text(`简介:${md.show}`)
                }.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween)
              }.width('100%')
              .backgroundColor('#ccc')
            }else if(md instanceof Videos){ //视频
              Column(){
                Row(){
                  // 视频: 名字 大小 简介 时长 类型 主演 画质 导演 制片人
                  Text(`视频名:${md.name}`)
                  Text(`大小:${md.size}`)
                  Text(`时长:${md.times}`)
                  Text(`类型:${md.type}`)

                }.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween)
                Row(){
                  Text(`导演:${md.dy}`)
                  Text(`主演:${md.zy}`)
                  Text(`画质:${md.hz}`)
                  Text(`制片人:${md.zpr}`)
                }.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween)
                Row(){
                  Text(`简介:${md.show}`)
                }.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween)
              }.width('100%')
              .backgroundColor('#aaa')

            }
          }
          .swipeAction({
            end:this.DelButton(index)
          })
        })
      }.height(400).width('90%')
      Row(){
        Button('音频')
          .type(ButtonType.Normal).width('40%')
          .onClick(() => this.isAorV=false)
        Button('视频')
          .type(ButtonType.Normal).width('40%')
          .onClick(() => this.isAorV=true)
      }.width('90%').justifyContent(FlexAlign.SpaceBetween).margin({top:10})
      if(this.isAorV){ //视频
        // 视频: 名字 大小 简介 时长 类型 主演 画质 导演 制片人
        Column({space:5}){
          Text('视频添加')
          Row(){
            TextInput({placeholder:'视频名称'}).borderRadius(0).width('30%')
              .onChange(val=>this.vd.name=val)
            TextInput({placeholder:'大小'}).borderRadius(0).width('30%')
              .onChange(val=>this.vd.size=parseFloat(val))
            TextInput({placeholder:'时长'}).borderRadius(0).width('30%')
              .onChange(val=>this.vd.times=parseFloat(val))
          }.width('100%').justifyContent(FlexAlign.SpaceBetween)
          Row(){
            TextInput({placeholder:'类型'}).borderRadius(0).width('30%')
              .onChange(val=>this.vd.type=val)
            TextInput({placeholder:'主演'}).borderRadius(0).width('30%')
              .onChange(val=>this.vd.zy=val)
            TextInput({placeholder:'制片人'}).borderRadius(0).width('30%')
              .onChange(val=>this.vd.zpr=val)
          }.width('100%').justifyContent(FlexAlign.SpaceBetween)
          Row(){
            TextInput({placeholder:'画质'}).borderRadius(0).width('30%')
              .onChange(val=>this.vd.hz=val)
            TextInput({placeholder:'导演'}).borderRadius(0).width('30%')
              .onChange(val=>this.vd.dy=val)
            TextInput({placeholder:'简介'}).borderRadius(0).width('30%')
              .onChange(val=>this.vd.show=val)
          }.width('100%').justifyContent(FlexAlign.SpaceBetween)
          Button('添加').width('90%')
            .onClick(()=>{
              //非空验证
              if(this.vd.name==''||this.vd.size==0||this.vd.hz==''||this.vd.type==''||this.vd.zy==''||this.vd.zpr==''||this.vd.show==''||this.vd.times==0||this.vd.dy==''){
                promptAction.showToast({message:'不能为空'})
              }else{
                let b:Videos=this.vd
                let vd1:Videos=new Videos(b.name,b.size,b.show,b.times,b.zy,b.hz,b.dy,b.zpr,b.type)
                this.medias.push(vd1)
                promptAction.showToast({message:'音频添加成功'})
              }
            })
        }.width('90%')

      }else{ //音频
        // 音频: 名字 大小 简介 作曲 作词 原唱 翻唱 时长
        Column({space:5}){
          Text('音频添加')
          Row(){
            TextInput({placeholder:'音频名称'}).borderRadius(0).width('45%')
              .onChange(val=>this.ad.name=val)
            TextInput({placeholder:'大小'}).borderRadius(0).width('45%')
              .onChange(val=>this.ad.size=parseFloat(val))
          }.width('100%').justifyContent(FlexAlign.SpaceBetween)
          Row(){
            TextInput({placeholder:'时长'}).borderRadius(0).width('45%')
              .onChange(val=>this.ad.times=parseFloat(val))
            TextInput({placeholder:'作曲'}).borderRadius(0).width('45%')
              .onChange(val=>this.ad.zp=val)
          }.width('100%').justifyContent(FlexAlign.SpaceBetween)
          Row(){
            TextInput({placeholder:'作词'}).borderRadius(0).width('45%')
              .onChange(val=>this.ad.zc=val)
            TextInput({placeholder:'原唱'}).borderRadius(0).width('45%')
              .onChange(val=>this.ad.yc=val)
          }.width('100%').justifyContent(FlexAlign.SpaceBetween)
          Row(){
            TextInput({placeholder:'翻唱'}).borderRadius(0).width('45%')
              .onChange(val=>this.ad.fc=val)
            TextInput({placeholder:'简介'}).borderRadius(0).width('45%')
              .onChange(val=>this.ad.show=val)
          }.width('100%').justifyContent(FlexAlign.SpaceBetween)
          Button('添加').width('90%')
            .onClick(()=>{
              //非空验证
              if(this.ad.name==''||this.ad.size==0||this.ad.zp==''||this.ad.zc==''||this.ad.yc==''||this.ad.fc==''||this.ad.show==''||this.ad.times==0){
                promptAction.showToast({message:'不能为空'})
              }else{
                let a:Audio=this.ad
                let ad1:Audio=new Audio(a.name,a.size,a.show,a.times,a.zp,a.zc,a.yc,a.fc)
                this.medias.push(ad1)
                promptAction.showToast({message:'音频添加成功'})
              }
            })
        }.width('90%')
      }
    }
    .height('100%')
    .width('100%')
  }
  @Builder DelButton(index:number){
    Button('删除')
      .type(ButtonType.Normal)
      .width('20%')
      .height(150)
      .onClick(() => {
        this.medias.splice(index,1)
      })
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值