【Dart】=> [06] Dart初体验-类Class-构造函数-继承-mixin-异步编程-链式调用-泛型-异常

目录

    • 能够定义并使用Dart的类
    • 类的定义
    • 构造函数
    • 私有属性和方法
    • 继承
    • mixin
    • 异步编程
    • Future
    • Future链式调用
    • async - await
    • dynamic类型
    • 泛型
    • 异常

能够定义并使用Dart的类

Dart是一门面向对象的编程语言,所有的对象都是类的实例 通过类我们可以对数据和方法进行封装复用

学习内容:

  1. 类的定义
  2. 构造函数
  3. 私有属性和方法
  4. 继承
  5. mixin

类的定义

使用 class 关键字声明一个类,所有的类都是继承自 Object 类
类的组成:属性 和 方法
属性和方法都是通过 . 访问的
例子:定义一个Person类,属性是名字和年龄,方法是吃饭

在这里插入图片描述
在这里插入图片描述
整体代码

void main() {// 创建Person对象// Person person = Person();// // 给属性赋值// person.name = '张三';// person.age = 18;// 使用自定义类名构造函数创建对象// Person person = Person('李四', 19);// 使用命名构造函数创建对象// Person person = Person.withName('王五');// 使用工厂构造函数创建对象// Person person = Person.withInfo('赵六', 21);Person person = Person.withInfo('赵六', -21);print('我叫 ${person.name} 今年 ${person.age}');Person person1 = Person.withAge(20);print(person1.age);// 调用方法person.eat();
}// 例子:定义Person类,属性:名字和年龄,方法:吃饭
class Person {// 默认的构造函数(无参数,默认隐藏)// Person() {//   print('我是默认的构造函数');// }// 自定义类名构造函数:可以有参数// 注意点:与类同名的构造函数只能有一个,如果自定义了类名构造函数,那么默认的构造函数就失效// Person(String name, int age) {//   this.name = name;//   this.age = age;// }// 简写:自定义类名构造函数时,如果函数的参数和类的属性同名Person(this.name, this.age);// 定义命名构造函数// Person.withName(String name) {//   this.name = name;// }// 简写Person.withName(this.name);Person.withAge(this.age);// 定义工厂构造函数// factory Person.withInfo(String name, int age) {//   // 需要手动的创建对象并返回//   return Person(name, age);// }// 例子:如果age < 0,那么person对象的年龄默认设置为0factory Person.withInfo(String name, int age) {// 需要手动的创建对象并返回return age < 0 ? Person(name, 0) : Person(name, age);}// 属性String? name;int? age;// 方法void eat() {print('我是干饭人');}
}

构造函数

创建对象时调用的函数,常用的构造函数有:

  1. 类名构造函数
  2. 命名构造函数
  3. 工厂构造函数

类名构造函数,与类同名的构造函数

  1. 默认构造函数(无参数,默认隐藏)

在这里插入图片描述

  1. 自定义类名构造函数(可以有参数)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

注意点:类名构造函数,只能有一个,如果自定义了类名构造函数,那么默认的类名构造函数就无效了

命名构造函数,可以为类提供多个不同的构造函数
定义方式:类名.函数名() {}

 // 简写:自定义类名构造函数时,如果函数的参数和类的属性同名Person(this.name, this.age);// 定义命名构造函数// Person.withName(String name) {//   this.name = name;// }// 简写Person.withName(this.name);Person.withAge(this.age);

工厂构造函数,不会直接创建对象,而是在构造函数内部通过代码来决定要创建的对象
定义方式: 使用 factory 关键字声明工厂构造函数

  // 定义工厂构造函数// factory Person.withInfo(String name, int age) {//   // 需要手动的创建对象并返回//   return Person(name, age);// }

例子:如果创建Person对象时,age < 0,则该Person对象的年龄默认设置为0

  // 例子:如果age < 0,那么person对象的年龄默认设置为0factory Person.withInfo(String name, int age) {// 需要手动的创建对象并返回return age < 0 ? Person(name, 0) : Person(name, age);}

使用场景:当需要根据条件来决定要返回的对象时,比如:单例

私有属性和方法

  1. 私有属性和方法:
    在类中定义,不对外暴露,不能被其他Dart文件访问的属性和方法
  2. 如何定义私有属性和方法:
    使用 _ 定义属性和方法
// 导入Dart文件、库
import '28_类_私有属性和方法.dart';void main() {// 创建Dog对象Dog dog = Dog();dog.name = '旺财';print(dog.name);// 私有属性调用失败// dog._age;dog.eat();// 私有方法调用失败// dog._run();
}

继承

通过继承可以让子类拥有父类的一些属性和方法。如何实现继承:

  • 如何实现继承:
    • 子类使用 extends 关键字继承父类
  • 继承的特点:
    • Dart的继承是单继承,一个子类只能有一个父类
    • 子类只会继承父类里面可见的属性和方法,不会继承私有属性和方法
    • 子类只会继承父类默认的构造函数,不会继承其他构造函数
    • 子类可以重写父类的方法,也可以使用 super 调用父类方法
void main() {// 创建猫// Cat cat = Cat();// cat.name = 'Tom';Cat cat = Cat('Tom');print(cat.name);cat.eat();cat.walk();// 创建鱼// Fish fish = Fish();// fish.name = '鲨鱼';Fish fish = Fish('鲨鱼');print(fish.name);fish.eat();fish.swim();
}// 猫,吃饭和走路
class Cat extends Animal {Cat(String name) : super(name);// String? name;// void eat() {//   print('eat');// }// 重写父类的方法void eat() {// 执行子类自己的逻辑print('执行子类自己的逻辑');// 使用super去调用父类的方法// super.eat();}void walk() {print('walk');}
}// 鱼,吃饭和游泳
class Fish extends Animal {// 定义子类自己的构造函数,并且使用super调用父类的构造函数传递数据Fish(String name) : super(name);// String? name;// void eat() {//   print('eat');// }void swim() {print('swim');}
}// 定义一个父类,父类里面有其他类都有的属性和方法
// 使用继承,让子类继承父类,从而子类就自动拥有了父类的属性和方法
class Animal {// 自定义类名构造函数// 如果父类自定义构造函数,那么子类继承不到,所以子类需要自己定义构造函数Animal(this.name);String? name;void eat() {print('eat');}
}// class Animal1 {
//   String? age;//   void sleep() {
//     print('eat');
//   }
// }

mixin

mixin 可以理解为扩展类,可以为类扩展功能,而不需要使用继承,类似Vue里面的混入。

如何定义并使用 mixin

  • 定义:mixin 关键字
  • 使用:with 关键字

mixin 的特点:

  • 可以扩展属性和方法
  • 不能被实例化,不能被继承
void main() {Person person = Person();// name是继承的person.name = '张三';print(person.name);// height是通过mixin扩展的person.height = 180.0;print(person.height);// eat()是继承的person.eat();// walk()是通过mixin扩展的person.walk();person.study();// mixin不能被实例化,不能被继承// WalkMixin();
}// mixin可以使用多个
mixin StudyMixin {void study() {print('study');}
}// 定义mixin
mixin WalkMixin {double? height;void walk() {print('walk');}
}// 人,吃饭和走路
class Person extends Animal with WalkMixin, StudyMixin {// String? name;// void eat() {//   print('eat');// }// void walk() {//   print('walk');// }
}// 猫,吃饭和走路
class Cat extends Animal with WalkMixin {// void walk() {//   print('walk');// }
}// 鱼,吃饭和游泳
class Fish extends Animal {void swim() {print('swim');}
}// 定义基类:动物
class Animal {String? name;void eat() {print('eat');}// void walk() {//   print('walk');// }
}

异步编程

能够使用Dart异步编程解决耗时操作阻塞程序的问题

在Web端和APP中,有很多耗时操作都需要 异步执行
Web端的异步解决方案是 Promise,再配合 async – await 更能以同步的方式编写异步代码
Dart也同样提供了异步解决方案 Future ,也可以配合 async – await 使用

学习内容:
1.Future
2.async - await

Future

  • Future是一个表示延迟计算的对象。代表一些计算将异步进行
  • Future会在耗时操作执行完毕前直接返回,而不会等待耗时操作执行结束
  • 例子:模拟耗时操作阻塞程序,并使用Future解决程序阻塞问题
// 模拟耗时操作阻塞程序的问题,并使用Future解决阻塞问题print('开始喽');Future(() {// 耗时任务执行的地方sleep(Duration(seconds: 5));// 故意编写的异常代码(测试)// dynamic str = 'hehe';// str.haha();// 返回异步任务执行的结果return '假装这是异步任务执行的结果';}).then((value) {// 监听异步任务执行结束print(value);}).catchError((e) {// 捕获异常信息print(e);});

Future链式调用

例子:用户先登录并获取用户信息,再保存用户信息

// Future链式调用// 用户先登录拿到用户信息,然后再保存用户信息Future login(String name, String password) {return Future(() {sleep(Duration(seconds: 2));print('登录操作');return 'userInfo';});}Future saveUserInfo(String userInfo) {return Future(() {sleep(Duration(seconds: 2));print('保存用户信息');return 'OK';});}// Future链式调用login('张三', '123456').then((value) {saveUserInfo(value);});print('假装这是个不能被阻塞的代码');

async - await

  1. Future 配合 async – await 以同步的方式编写异步代码
  2. 例子:用户先登录并获取用户信息,再保存用户信息
 // Future链式调用// 用户先登录拿到用户信息,然后再保存用户信息Future login(String name, String password) {return Future(() {sleep(Duration(seconds: 2));print('登录操作');return 'userInfo';});}Future saveUserInfo(String userInfo) {return Future(() {sleep(Duration(seconds: 2));print('保存用户信息');return 'OK';});}// Future链式调用// login('张三', '123456').then((value) {//   saveUserInfo(value);// });// async awaitvoid doLogin() async {String userInfo = await login('李四', '123456');await saveUserInfo(userInfo);}doLogin();print('假装这是个不能被阻塞的代码');

dynamic类型

能够知道dynamic类型的特点

在Dart中,虽然有类型推断和类型检查
但是,还可以使用 dynamic 关键字关闭变量的类型检查

特点:
编码灵活,可以保存任意类型的数据
容易产生 NoSuchMethodError 的异常

void main() {int a = 15;// a = 'itcast';a = 20;// dynamic会关闭编译器的类型检查dynamic b = 100;b = 'itheima';print(b);// b.haha();// b.hehe;
}

泛型

能够知道泛型的作用

泛型是指类型的不确定性,数据具体的类型可以在使用时确定

  1. 使用泛型可以限定类型
  // 泛型限定数据的类型:List Map// 保存视频分类名称时,不应该出现100 true这样类型的数据// List categories = ['居家', '美食', 100, true];List<String> categories = ['居家', '美食'];
使用泛型可以明确约束列表元素的类型使用泛型可以明确约束字典的key和value的类型
 Map<String, String> category = {'id': '1','name': '居家',};
  1. 使用泛型可以减少重复代码
  // 封装方法:接收什么类型的数据,就返回什么类型T demo<T>(T parm) {return parm;}

异常

能够知道如何捕获并处理异常

  1. 如何捕获异常:
    使用关键字 try catch 捕获并处理异常
    finally:无论是否有异常都会执行到的语句块
  // 捕获异常:try catch// try {//   dynamic name = 'zzm';//   name.haha();// } catch (e) {//   print(e);// } finally {//   // 无论是否有异常都会执行这个代码块//   print('finally');// }
  1. 如何手动抛出异常:使用关键字 throw 手动抛出异常
// 手动抛出异常:判断字符串是否相等,如果不相等手动抛出异常try {String str = 'zzm';if (str == 'zxc') {print('ok');} else {// 手动抛出异常throw '字符串不相等';}} catch (e) {print(e);}

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

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

相关文章

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (1) | 引言与知识基础

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

NLP论文阅读记录 - 2022 | WOS 用于摘要法律文本的有效深度学习方法

文章目录 前言0、论文摘要一、Introduction1.1目标问题 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结 前言 Effective deep learning approaches for summarization of legal texts&#xff08;22&#x…

Linux -- Nginx服务基础

4.1Nginx服务基础 Nginx(发音为[engine x])专为性能优化而开发&#xff0c;其最知名的优点是它的稳定性和低系统资源消 耗&#xff0c;以及对HTTP并发连接的高处理能力&#xff08;单台物理服务器可支持30000~50000个并发请求&#xff09;&#xff0c;正因 为如此&#xff0c;…

vscode中关于python的一些常用配置

文章目录 python cv2 提示配置第一步 配置提示信息第二部 重启vs 可能还不行&#xff0c;那就重新安装以下opencv-python 配置pytest还是如上&#xff0c;将下入的位置打开编写测试用例 配置跨文件import在工作目录中新建一个.env文件输入内容如下打开.vscode中的setting.json …

目标识别跟踪模块Tofu3

Tofu系列提供了适应不同目标、不同速率的识别跟踪模块产品系列&#xff0c;主要包括Tofu3&#xff0c;4&#xff0c;5&#xff0c;S和其他零配件&#xff0c;可以适配BT.656,Cameralink&#xff0c;网络等不同接口和协议的热红外、可见光视频。 Tofu3 是多波段视频物体识别跟踪…

GL Logger和CANFDLog-OTL-128两款记录仪都是如何实现高效的报文录制的?

GL Logger是Vector推出的记录CAN/CAN FD、LIN、FlexRay和MOST数据通信的工具。以GL2400为例带着大家一步步地实现路试过程中通过整车OBD口进行CAN/CANFD报文的录制。 Step1 设备配置 设备配置即设备录制方式、录制内容、设备休眠唤醒策略等。 ▷ 打开Vector Logger Configurat…

UML-用例图

提示&#xff1a;用例图是软件建模的开始&#xff0c;软件建模中的其他图形都将以用例图为依据。用例图列举了系统所需要实现的所有功能&#xff0c;除了用于软件开发的需求分析阶段&#xff0c;也可用于软件的系统测试阶段。 UML-用例图 一、用例图的基础知识1.用例图的构成元…

使用numpy处理图片——滤镜

大纲 3维数组切分打平重组法深度切分法 3维数组堆叠 我们在用手机拍照片时&#xff0c;往往会对照片进行滤镜处理&#xff0c;从而让照片更加美观。本文我们将实现几种滤镜效果——去除所有像素中的某一种原色&#xff0c;形成只有红绿、红蓝和绿蓝原色的照片。 为了突出色彩丰…

定制服务器有什么优势优点?

定制服务器是指在根据用户的需求和业务特点&#xff0c;专门设计和制造的服务器。与标准服务器相比&#xff0c;定制服务器具有以下优势和优点&#xff1a; 更好的性能&#xff1a;定制服务器可以针对特定应用进行优化&#xff0c;从而提高服务器的性能。由于定制服务器不需要…

Win和Mac系统重置系统方法

注意&#xff1a;重置系统前&#xff0c;请备份好系统盘资料到其他盘符&#xff01;重置系统将会删除应用和系统设置&#xff0c;甚至用户文件&#xff0c;还原为出厂设置模式。 Windows重置系统操作方法。&#xff08;目前支持WIN8&#xff0c;WIN10&#xff0c;WIN11&#x…

Linux系统使用docker部署Geoserver(简单粗暴,复制即用)

1、拉取镜像 docker pull kartoza/geoserver:2.20.32、创建数据挂载目录 # 统一管理Docker容器的数据文件,geoserver mkdir -p /mydata/geoserver# 创建geoserver的挂载数据目录 mkdir -p /mydata/geoserver/data_dir# 创建geoserver的挂载数据目录&#xff0c;存放shp数据 m…

【数据库原理】(24)数据库安全性策略

数据库安全性是数据库管理系统&#xff08;DBMS&#xff09;中一个至关重要的方面。它指的是保护数据库免受非授权访问和恶意操作&#xff0c;包括数据泄露、修改、破坏等。 多层安全模型 在典型的计算机系统安全模型中&#xff0c;安全措施被设置在不同层级&#xff1a; 应用…

Unity ComputeShader 使用GPU快速计算复杂问题

Unity ComputeShader 使用GPU快速计算复杂问题 前言项目创建ComputeShader编写CompturShader创建Unity代码场景布置运行场景 参考 前言 遇到一个问题&#xff0c;需要大量的计算&#xff0c;在Unity中直接写会长时间的阻塞主线程&#xff0c;正好使用ComputeShader让GPU来帮我…

海格里斯HEGERLS仓储货架生产厂家|载荷1.5T运行速度1.7~2m/s的智能四向穿梭车系统

四向穿梭车立体库是近年来出现的一种智能型密集系统&#xff0c;通过使用四向穿梭车在货架的水平和纵向轨道上运行来搬运货物&#xff0c;一台四向穿梭车就能完成货物的搬运工作&#xff0c;大大提高了工作效率。同时配合提升机、自动化仓库管理系统(WMS)和仓库调度系统(WCS)&a…

使用WAF防御网络上的隐蔽威胁之SSRF攻击

服务器端请求伪造&#xff08;SSRF&#xff09;攻击是一种常见的网络安全威胁&#xff0c;它允许攻击者诱使服务器执行恶意请求。与跨站请求伪造&#xff08;CSRF&#xff09;相比&#xff0c;SSRF攻击针对的是服务器而不是用户。了解SSRF攻击的工作原理、如何防御它&#xff0…

手写OpenFeign(简易版)

Remoting组件实现 1. 前言2. 原理说明3. 远程调用组件实现---自定义注解3.1 添加Spring依赖3.2 编写EnableRemoting注解3.3 编写RemoteClient注解3.4 编写GetMapping注解 4. 远程调用组件实现---生成代理类4.1 编写自定义BeanDefinition注册器4.2 编写自定义包扫描器4.3 编写Fa…

JVM初识

什么是JVM&#xff1f; JVM全称是Java Virtual Machine&#xff0c;中文译名Java虚拟机。 JVM本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 JVM的功能 jvm的功能主要分为三部分&#xff1a; 解释和运行 对字节码文件中的指令&#xff0c;实…

vue实现导出+ 样式修改

1.安装插件 npm xlsx-style ^0.18.5 npm install xlsx -S ^0.8.13 2. 修改代码 node_modules里面找到 以下位置xlsx.js 搜索 write_ws_xml_data 替换成以下代码 function write_ws_xml_data(ws, opts, idx, wb) {var o [], r [], range safe_decode_range(ws[!ref]…

搭建储能监控云平台:实现能源管理的智能化

搭建储能监控云平台&#xff1a;实现能源管理的智能化 在全球能源变革的大背景下&#xff0c;储能技术的重要性日益凸显。储能监控云平台作为能源管理的智能解决方案&#xff0c;可以为企业提供全方位的储能系统监控与数据分析&#xff0c;提高能源利用率&#xff0c;降低能源成…

QFN封装对国产双轴半自动划片机的性能有哪些要求?

1. 高精度切割&#xff1a;QFN封装要求芯片的尺寸和形状误差要尽可能小&#xff0c;因此对国产双轴半自动划片机的切割精度提出了高要求。高精度的切割能够提高封装的良品率和稳定性。 2. 快速和稳定&#xff1a;QFN封装生产需要快速、稳定的生产过程&#xff0c;因此对国产双轴…