鸿蒙ArkTS中的面向对象编程

  ArkTS是TypeScriptS的超集,而TS又是JavaScript的超集,意味着有JavaScript编程基础、结合一些TypeScript的使用经验就可以很快上手ArkTS。

  作为一门面向对象语言的学习,了解和掌握这门语言的面向对象(封装、继承、多态)、面向接口、面向抽象的知识很有必要。

  一、面向对象

  1、封装

  是面向对象编程中的一个核心概念,它允许将对象的数据(属性)和行为(方法)捆绑在一起,并对外隐藏内部的实现细节。

class Person {// 属性nationality: string = '中国'; // 国籍name?: string;               // 姓名age?: number;                // 年龄gender?:stringconstructor(name: string, age?: number,gender?:string) {this.name = name;this.age = age;this.gender=gender}// 方法SelfIntroduction(){if (this.age !== undefined && this.age !== null && this.age >0) {console.log(`My name is ${this.name}, and I am ${this.age} years old this year.`);} else {console.log(`My name is ${this.name}`);}}Study(){console.log(`${this.name}  is studying mathematics diligently.`);}
}let Student:Person=new  Person('小明',undefined,'male')
let Teacher:Person=new Person('宋老师',35,'female')
let Worker:Person=new Person('小王')Student.SelfIntroduction()
Teacher.SelfIntroduction()
Worker.SelfIntroduction()Teacher.Study()

  上面声明变量时如果不赋值,可以在变量名后面加?,包括对象的方法调用时传参也可以加?,但是如果后面紧跟着参数,该位置如果不传参数必须是undefined。

  这样传递参数时可以是变化的。

  这里也可以使用展开运算符来解决多参数传递的问题,例如:

function sum(num1:number,num2:number,...others:number[]):number{let total=num1+num2others.forEach(element => {total+=element});return total
}console.log(sum(1,2).toString())
console.log(sum(1,2,3,4,5).toString())

  当然,如果是多个参数传递,灵活一些应该将参数封装为一个(基于接口的)对象。

  声明接口:

interface Para{name: stringage: numbergender:string
}

  传递参数:

  constructor(ParaObj:Para) {this.name = ParaObj.namethis.age = ParaObj.agethis.gender=ParaObj.gender}

  实例化:

let Student:Person=new  Person({name:'小明',age:18,gender:'男'
})

  正规一些的写法:

interface Para{name: stringage: numbergender:string
}class Person {// 属性protected nationality: string = '中国' // 国籍public name: string               // 姓名private   _age: number            // 年龄private   _gender:stringconstructor(ParaObj:Para) {this.name = ParaObj.namethis._age = ParaObj.agethis._gender=ParaObj.gender}get age():number{return this._age}set age(value:number){this._age=value}// 方法public SelfIntroduction(){if (this.age !== undefined && this.age !== null && this.age >0) {console.log(`My name is ${this.name}, and I am ${this.age} years old this year.`);} else {console.log(`My name is ${this.name}`);}}
}let Student:Person=new  Person({name:'小明',age:18,gender:'男'
})Student.age=25
Student.SelfIntroduction()
console.log(Student.age.toString())

  正规一些的写法比较繁琐,但是能有效保护数据,上面的例子中_gender属性没有提供对应的get和set方法,除了初始化能赋值外,外面不能访问。

  2、继承
  继承允许一个类(子类)继承另一个类(父类)的属性和方法,这有助于代码复用和扩展。

interface Para{name: stringage: number
}class Person {// 属性protected nationality: string = '中国' // 国籍public name: string               // 姓名private   _age: number            // 年龄constructor(ParaObj:Para) {this.name = ParaObj.namethis._age = ParaObj.age}get age():number{return this._age}set age(value:number){this._age=value}// 方法public SelfIntroduction(){if (this.age !== undefined && this.age !== null && this.age >0) {console.log(`My name is ${this.name}, and I am ${this.age} years old this year.`);} else {console.log(`My name is ${this.name}`);}}
}class Student extends Person{//重写构造函数constructor(ParaObj:Para) {super(ParaObj); // 调用父类的构造函数//执行其他操作}Study(){console.log(`${this.name} is studying。`);}
}let Student1:Student=new  Student({name:'小明',age:18,
})Student1.age=25
Student1.SelfIntroduction()
console.log(Student1.age.toString())

  3、多态
  多态是指子类可以重写继承自父类的方法,使得同一个方法在不同的子类中可以有不同的实现。

class Person {// 属性public name: string               // 姓名constructor(name:string) {this.name = name}// 方法Action(){console.log('')}
}class Student extends Person{Action(){console.log(`${this.name} is studying。`);}
}class Teacher extends Person{Action(){console.log(`${this.name} is giving a lecture。`);}
}let Student1:Student=new  Student('小明')
Student1.Action()
let Teacher1:Teacher=new Teacher('王老师')
Teacher1.Action()

  二、面向接口

  ⑴当需要定义一个类应该具备的方法签名,但不提供方法的具体实现时,使用接口。
  ⑵当需要实现代码的松耦合,或者需要一个类遵循某些约定和规范时,使用接口。

interface Shape {draw(): void;
}class Circle implements Shape {radius: number;constructor(radius: number) {this.radius = radius;}draw(): void {console.log(`画一个半径为 ${this.radius} 的圆.`);}
}class Rectangle implements Shape {width: number;height: number;constructor(width: number, height: number) {this.width = width;this.height = height;}draw(): void {console.log(`画一个宽为 ${this.width} 高为 height ${this.height}的矩形.`);}
}

  继承多接口的例子:

class Person {name: string = '';age: number = 0;constructor(name: string, age: number) {this.name = name;this.age = age;}Info(): string {return `${this.name}, ${this.age}`;}
}interface Introduce {SayHello(): string;
}interface Work{Study():void;
}class Student extends Person implements Introduce,Work {grade: number = 0;constructor(name: string, age: number, grade: number) {super(name, age);this.grade = grade;}SayHello(): string {return `我是${this.grade}年级的学生,名叫${this.name}`;}Study(){console.log(`${this.name} 正在学习`)}
}let Student1:Student = new Student('小明', 18, 9);
console.log(Student1.Info())
console.log(Student1.SayHello());
Student1.Study()

  三、面向抽象

  ⑴当需要在多个子类之间共享代码时,使用抽象类。
  ⑵当需要强制子类实现某些方法,或者在共性较多的对象间寻求功能上的差异时,使用抽象类。

abstract class Animal {name: string;constructor(name: string) {this.name = name;}//吃abstract eat(food: string): void;//睡,有默认实现sleep(hours: number): void {console.log(`${this.name} is sleeping for ${hours} hours.`);}
}//Dog
class Dog extends Animal {constructor(name: string) {super(name);}eat(food: string): void {console.log(`${this.name} is eating ${food}.`);}
}//Cat
class Cat extends Animal {constructor(name: string) {super(name);}eat(food: string): void {console.log(`${this.name} is eating ${food}.`);}
}let dog1:Dog=new  Dog('虎仔')
let cat1:Cat=new Cat('小花')dog1.eat('骨头')
cat1.eat('猫食')
dog1.sleep(2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows与windows文件共享

目录 基础设置主机共享文件端设置从机接受文件端设置 基础设置 1、先确保两台电脑直接能够ping通,这是文件共享的前提,如果ping不通就去查找对应的原因,一般都是防火墙的原因。 在ping通的情况下: 2、先找到高级共享设置 3、对专…

Unity3D 开发教程:从入门到精通

Unity3D 开发教程:从入门到精通 Unity3D 是一款强大的跨平台游戏引擎,广泛应用于游戏开发、虚拟现实、增强现实等领域。本文将详细介绍 Unity3D 的基本概念、开发流程以及一些高级技巧,帮助你从零基础到掌握 Unity3D 开发。 目录 Unity3D…

[算法初阶]第二集 滑动窗口(已完结)

大家好啊,好久没有更新了,最近比较忙,所以来更新初阶算法,正好复习一下,感谢大家的观看,如有错误欢迎指出。 下面我们来看题目吧! 1.209. 长度最小的子数组 这题大家想必一眼就看出了解法一暴力法 这个解法很简单 代码如下,不做多的解释 class Solution { publi…

恋爱脑学Rust之Box与RC的对比

在遥远的某个小镇,住着一对年轻的恋人:阿丽和小明。他们的爱情故事就像 Rust 中的 Rc 和 Box 智能指针那样,有着各自不同的「所有权」和「共享」的理解。 故事背景 阿丽和小明准备共同养一株非常珍贵的花(我们称之为“心之花”&…

Move Dev Meetup@Beijing圆满结束,发掘Move生态新机会

Sui、Aptos 、Rooch 和 zkMove等为代表的 Move 生态在 2024 年展现出强劲的生命力和发展速度。随着技术的持续演进,Move 语言的独特优势吸引了大量优质项目、开发者、投资者和爱好者的参与,共同推动生态建设和创新应用。新一轮技术革新已经开启&#xff…

Python | Leetcode Python题解之第530题二叉搜索树的最小绝对差

题目: 题解: # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val x # self.left None # self.right Noneclass Solution(object):def isValidBST(self, root):"…

数字经济赋能新质生产力数据集-dta格式(2012-2022年)

数据简介:新质生产力以新发展理念为思想指引,驱动数字经济创新发展动力、推动区域协调发展、转变发展方式、拓宽国际市场、共享数据要素,为数字经济高质量发展提供强大 动力支持。数字经济在发展过程中可能会存在关键性技术创新能力不足、传统…

Oracle视频基础1.4.3练习

15个视频 1.4.3 できない dbca删除数据库 id ls cd cd dbs ls ls -l dbca# delete a database 勾选 # chris 勾选手动删除数据库 ls ls -l ls -l cd /u01/oradata ls cd /u01/admin/ ls cd chris/ ls clear 初始化参数文件,admin,数据文件#新版本了…

.net core 接口,动态接收各类型请求的参数

[HttpPost] public async Task<IActionResult> testpost([FromForm] object info) { //Postman工具测试结果&#xff1a; //FromBody,Postman的body只有rawjson时才进的来 //参数为空时&#xff0c;Body(form-data、x-www-form-urlencoded)解析到的数据也有所…

《JVM第5课》虚拟机栈

无痛快速学习入门JVM&#xff0c;欢迎订阅本免费专栏 Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff0c;简称JVM栈&#xff0c;又称Java方法栈&#xff09;是 JVM 运行时数据区的一部分&#xff0c;主要用于支持Java方法的执行。每当一个新线程被创建时&#xf…

Axure大屏可视化模板:赋能各行各业的数据展示与管理

如何高效、直观地展示和分析数据&#xff0c;成为企业和机构面临的重要挑战。Axure大屏可视化模板作为一种先进的数据展示工具&#xff0c;凭借其强大的交互性和直观性&#xff0c;在多个领域内得到了广泛应用。从农业生产的智能化管理到城市发展的精细化管理&#xff0c;再到企…

【软考】Redis不同的数据类型和应用场景。

Redis的不同数据类型和对应的应用场景&#xff1a; Redis 数据类型及其应用场景 String&#xff08;字符串&#xff09; 特点&#xff1a;简单的值存储&#xff0c;支持二进制数据。应用场景&#xff1a; 缓存用户会话。缓存小的配置文件。缓存计数器。文章浏览量&#xff0…

楼梯区域分割系统:Web效果惊艳

楼梯区域分割系统源码&#xff06;数据集分享 [yolov8-seg-FocalModulation&#xff06;yolov8-seg-GFPN等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al l…

HarmonyOS Next星河版笔记--界面开发(3)

属性 1.1.设计资源-svg图标 需求&#xff1a;界面中展示图标→可以使用的svg图标(任意放大缩小不失真、可以改变颜色) 使用方式&#xff1a; ①设计师提供&#xff1a;基于项目的图标&#xff0c;拷贝到项目目录使用 Image($r(app.media.ic_dianpu)) .width(40) fillColor…

java项目之洗衣店订单管理系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的洗衣店订单管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于springboot的洗衣…

探索Unity:从游戏引擎到元宇宙体验,聚焦内容创作

unity是实时3D互动内容创作和运营平台&#xff0c;包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助Unity将创意变成现实。提供一整套完善的软件解决方案&#xff0c;可用于创作、运营和变现任何实时互动的2D和3D内容&#xff0c;支持平台包括手机、…

(十二)JavaWeb后端开发——MySQL数据库

目录 1.数据库概述 2.MyQSL 3.数据库设计 DDL 4.MySQL常见数据类型 1.数据库概述 数据库&#xff1a;DataBase(DB)&#xff0c;是存储和管理数据的仓库 数据库管理系统&#xff1a;DataBase ManagementSystem(DBMS)&#xff0c;操纵和管理数据库的大型软件 SQL&#xff…

深入浅出 Spring Boot 与 Shiro:构建安全认证与权限管理框架

一、Shiro框架概念 &#xff08;一&#xff09;Shiro框架概念 1.概念&#xff1a; Shiro是apache旗下一个开源安全框架&#xff0c;它对软件系统中的安全认证相关功能进行了封装&#xff0c;实现了用户身份认证&#xff0c;权限授权、加密、会话管理等功能&#xff0c;组成一…

【WRF数据准备】土地利用类型分类标准:USGS+MODIS IGBP 21

【WRF数据准备】土地利用类型分类标准&#xff1a;USGSMODIS IGBP 21 WRF常用土地类型分类MODIS IGBP 21USGSNLCD Landuse 选择土地利用分类标准替换城市土地类型后更改土地利用分类参考 WRF常用土地类型分类 WRF中土地利用类型最高分辨率是30s&#xff0c;且主要分为MODIS和U…

「C/C++」C/C++ 之 变量作用域详解

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…