鸿蒙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,一经查实,立即删除!

相关文章

来了解一下!!!——React

React 是一个用于构建用户界面的 JavaScript 库,特别适合用于创建单页面应用程序(SPA)。它由 Facebook 维护,并且拥有一个活跃的社区,这使得 React 成为了目前最流行的前端框架之一。以下是关于 React 的一些重要信息和…

刷题(question)

Description 比赛之路多艰,做题方得提升。努力刷题的人在比赛中往往能取得很好的成绩,小红就是这样的人。 为了继续提升自己的编程实力,小红整理了一份刷题题单,并选中了题单中的 n 道编程题,将它们从 1 到 n 编号&a…

windows与windows文件共享

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

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

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

第二届新生程序设计竞赛热身赛(C语言)

A:饥饿的XP XP迷失在X星球,他醒来时已经很久很久很久没有吃过东西了。他突然发现身边有一张地图,上面有X星球上每一个食物供给点的位置。太好了,XP跳了起来。他决定先把肚子填饱再去寻找其他伙伴。现在已知XP的位置(X, Y),以及他的…

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

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

程序《工资分类收税》

学习目标&#xff1a; 使用代码完成完成程序《工资分类收税》 题目&#xff1a; 假设税前工资和税率如下&#xff08;s代表税前工资&#xff0c;t代表税率&#xff09;&#xff1a;s<1000 t0%1000<s<2000 t10%2000<s<3000 t15%3000<s<4000 …

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

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

大型音频模型:AudioLLMs

大型音频模型&#xff08;Large Audio Models&#xff0c;简称AudioLLMs&#xff09;是近年来人工智能领域的一个重要研究方向&#xff0c;它们基于深度学习和大模型架构&#xff0c;能够处理和理解复杂的音频数据。以下是对大型音频模型的研究综述&#xff1a; 1. 引言 随着…

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

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

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

题目&#xff1a; 题解&#xff1a; # 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年)

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

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 初始化参数文件&#xff0c;admin&#xff0c;数据文件#新版本了…

.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;再到企…

MYSQL 小猫钓鱼 - 猫王争霸之〈主从设计〉

在美丽的森林中&#xff0c;小猫们的钓鱼大赛依旧热闹非凡&#xff0c;而 “猫王争霸” 的竞争也越来越激烈。随着时间的推移&#xff0c;越来越多的动物们开始关注这场有趣的比赛&#xff0c;对鱼表数据的查询请求也急剧增加。 一、请求压力剧增 花猫看着鱼表发愁道&#xf…

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

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

leetcode hot100【LeetCode 3. 无重复字符的最长子串】java实现

LeetCode 3. 无重复字符的最长子串 题目描述 给定一个字符串&#xff0c;请你找出其中不含有重复字符的最长子串的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释&#xff1a;最长的无重复字符的子串是 "abc"&#xff0c;其长度为 3。示例 2: 输入…

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

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