dart学习记录5(类、对象)

1.获取运行时对象类型

使用Object 属性的 runtimeType,它返回一个 Type 对象。

print('a 的类型是 ${a.runtimeType}');

⚠️警告

在测试对象的类型时建议使用object is Type比测试 object.runtimeType == Type 更稳定。

2.实例变量的声明

class Point {double? x; // 声明实例变量 x,初始值为 null。double? y; // 声明 y,初始值为 null。double z = 0; // 声明 z,初始值为 0。
}

所有实例变量都会生成一个隐式的 getter 方法。非final的实例变量,以及未初始化的late final实例变量,都会生成一个隐式的setter方法。

class Point {double? x; // 声明实例变量 x,初始值为 null。double? y; // 声明 y,初始值为 null。
}void main() {var point = Point();point.x = 4; // 使用 x 的 setter 方法。assert(point.x == 4); // 使用 x 的 getter 方法。assert(point.y == null); // 默认值为 null。
}

在声明时初始化非 late 实例变量会在实例创建时设置值,在构造函数及其初始化列表执行之前。因此,非 late 实例变量的初始化表达式(= 之后的表达式)无法访问 this。

double initialX = 1.5;class Point {// 可以访问不依赖 `this` 的声明:double? x = initialX;// 错误,在非 `late` 初始化器中无法访问 `this`:double? y = this.x;// 可以,在 `late` 初始化器中访问 `this`:late double? z = this.x;// 可以,`this.x` 和 `this.y` 是参数声明,不是表达式:Point(this.x, this.y);
}

实例变量可以是 final 的,在这种情况下它们必须被设置且仅设置一次。可以在声明时使用构造函数参数或者使用构造函数的初始化列表来初始化final类型的非late实例变量。

class ProfileMark {final String name;final DateTime start = DateTime.now();ProfileMark(this.name);	//使用构造函数参数,来初始化final类型的非late实例变量ProfileMark.unnamed() : name = '';	//使用构造函数的初始化列表,来初始化final类型的非late实例变量
}

如果您需要在构造函数体开始后为 final 实例变量赋值,可以使用以下方法之一:

  • 使用工厂构造函数。
  • 使用 late final,但要小心:没有初始值设定器的late final会为 API 添加一个 setter。

3.隐式接口

每个类都隐式地定义了一个接口,该接口包含该类的所有实例成员以及它所实现的任何接口的实例成员。如果你想创建一个支持类 B 的应用程序编程接口(API)但又不继承 B 的实现的类 A,那么类 A 应该实现 B 接口。

implements 关键字主要用于类实现接口

  • 概念:接口规定了一组方法的签名,不过不包含具体实现。类借助 implements 关键字来实现接口时,就必须实现接口里定义的所有方法

  • 使用方法:在类定义时,运用 implements 关键字,后面紧跟一个或多个接口名,若有多个接口,用逗号分隔。类需要实现接口中定义的所有方法。

  • 示例

// 定义一个接口
abstract class Animal {void eat();void sleep();
}// 实现接口的类
class Dog implements Animal {void eat() {print('Dog is eating.');}void sleep() {print('Dog is sleeping.');}
}void main() {Dog dog = Dog();dog.eat();dog.sleep();
}

在上述代码中,Animal 是一个接口,定义了 eat 和 sleep 方法。Dog 类使用 implements 关键字实现了 Animal 接口,并且实现了接口中定义的所有方法。

与 extends 的区别

  • extends:用于类的继承,一个类只能单继承,子类会继承父类的实现。
  • implements:用于实现接口,一个类可以实现多个接口,类需要自己实现接口中定义的所有方法

一个类通过在 implements 子句中声明一个或多个接口,然后提供这些接口所要求的 API 来实现它们。

以上来自AI的解释,下面是dart官方文档的
类通过在 implements 子句中声明一个或多个接口并提供接口所需的 API 来实现它们。例如:

// 一个 person类. 包含一个隐式接口greet().
class Person {// 在接口中,但仅在此类中可见.final String _name;// 不在接口中,因为这是一个构造函数.Person(this._name);// 在接口中.String greet(String who) => 'Hello, $who. I am $_name.';
}// Person 接口的一个实现类.
class Impostor implements Person {String get _name => '';String greet(String who) => 'Hi $who. Do you know who I am?';
}String greetBob(Person person) => person.greet('Bob');void main() {print(greetBob(Person('Kathy')));	//你好,Bob。我是 Kathyprint(greetBob(Impostor()));	//嗨 Bob。你知道我是谁吗?
}

4.类变量和方法

使用 static 关键字来实现类级的变量和方法。

  • 静态变量
    静态变量(类变量)对于类范围的状态和常量非常有用
class Queue {static const initialCapacity = 16;// ···
}void main() {assert(Queue.initialCapacity == 16);	//静态成员/方法无需创建实例,直接访问/调用
}

静态变量只有在使用时才会被初始化

  • 静态方法
    静态方法(类方法)不作用于实例,因此无法访问 this。但是,它们可以访问静态变量。如下例所示,您直接在类上调用静态方法:
import 'dart:math';class Point {double x, y;Point(this.x, this.y);static double distanceBetween(Point a, Point b) {var dx = a.x - b.x;var dy = a.y - b.y;return sqrt(dx * dx + dy * dy);}
}void main() {var a = Point(2, 2);var b = Point(4, 4);var distance = Point.distanceBetween(a, b);assert(2.8 < distance && distance < 2.9);print(distance);
}

⚠️注意

对于常用或广泛使用的工具和功能,考虑使用顶级函数,而不是静态方法。
您可以将静态方法用作编译时常量。例如,您可以将静态方法作为参数传递给常量构造函数。

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

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

相关文章

启明星辰春招面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

Live555+Windows+MSys2 编译Androidso库和运行使用

下载 wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz tar -xzvf live555-latest.tar.gz加入版本控制 git init git add . git commit -a -m "first init" git log修改config.android-arm64 cd live vim config.android-arm64 ./genMakefile…

实用工具-Stirling-PDF

windows桌面版参考这个文档 Getting Started | Stirling-PDF 安装包推荐使用迅雷下载&#xff0c;先转存到迅雷网盘在使用迅雷下载速度嘎嘎快。 github:https://github.com/Stirling-Tools/Stirling-PDF Stirling-PDF 是一个强大的、基于 Web 的开源 PDF 处理工具&#xff0c…

借助AI Agent实现数据分析

在当今数据驱动的世界中&#xff0c;数据分析已成为企业决策、科学研究和社会治理的核心工具。然而&#xff0c;随着数据量的爆炸式增长和复杂性的提升&#xff0c;传统的数据分析方法面临着效率低下、成本高昂和人力不足等挑战。AI技术的快速发展&#xff0c;尤其是AI Agent的…

JavaScript实现一个函数,将数组扁平化(flatten),即把多维数组转为一维数组。

大白话实现一个函数&#xff0c;将数组扁平化&#xff08;flatten&#xff09;&#xff0c;即把多维数组转为一维数组。 思路 实现数组扁平化的基本思路是遍历数组中的每个元素&#xff0c;如果元素是数组&#xff0c;就递归地将其扁平化并添加到结果数组中&#xff1b;如果元…

麒麟操作系统安装人大金仓数据库

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 在当前数字化转型和信息安全备受重视的背景下&#xff0c;众多公司积极推进国产化改造进程。在操作系统领域&#xff0c;统信、open 欧拉、中标麒麟、银河麒麟等国产操作系统崭露头角&#xff0c;逐…

开发SAPUI5 Fiori应用并部署到SAP系统

首先新建一个项目文件夹 在VScode中打开 打开SAP Fiori&#xff08;需要先下载安装&#xff0c;参考上上一篇文章&#xff09; ,选择已添加的SAP S4 ERP系统 ,点击创建Firoi应用。 如果没有添加系统的&#xff0c;点击添加按钮&#xff0c;添加即可&#xff0c;注意&#xff…

右键添加:新建HTML模板文件

使用注册表给Windows右键添加:新建HTML文档模板的功能_注册表右键新建-CSDN博客 新建文件有了&#xff0c;但是没有引用模板文件&#xff0c;是空文件。 默认改成 htmlfile 模板成功

[极客大挑战 2019]Knife——3.20BUUCTF练习day4(1)

[极客大挑战 2019]Knife——3.20BUUCTF练习day4(1) 很简单 蚁剑连接 根目录下有flag flag{f77e8444-dd87-48b3-8fe0-a735b5a5c708}

力扣22.括号生成

22. 括号生成 - 力扣&#xff08;LeetCode&#xff09; 代码区&#xff1a; class Solution {vector<string> ans; public:vector<string> generateParenthesis(int n) {dfs(0,0,n,"");return ans;}void dfs(int left,int right,int n,string str){if(l…

第37周:文献阅读

目录 摘要 Abstract 文献阅读 问题引入 研究背景 研究意义 研究目的 实验方法 TimeGAN 数据增强 预测模型的独立性 创新点 实验研究 数据准备 合成数据分析 模型比较 总结 摘要 该文献围绕利用 TimeGAN 提高供热变电站热负荷预测精度展开。结构上&#x…

NFS 安装与测试

NFS 安装与测试 服务器 # NFS 共享目录 mkdir -p ${HOME}/Share/nfs && sudo chown -R nobody:nogroup ${HOME}/Share/nfs# 安装 NFS Server sudo apt install nfs-kernel-server# 配置 NFS 目录 sudo cp -arf /etc/exports /etc/exports.bak sudo tee -a /etc/exports…

算法题(103):数独

审题&#xff1a; 本题需要我们找出数独的解&#xff0c;并打印出来 时间复杂度分析&#xff1a; 本题是9*9的数独格子&#xff0c;所以数据量小于25&#xff0c;可以使用2^n的算法 思路&#xff1a; 方法一&#xff1a;深度优先搜索 首先确定搜索及插入策略&#xff1a; 我们采…

snmp/mib采用子代理模式,编码,部署

0.环境 0.1 编译net-snmp cd net-snmp-5.7.2 ./configure --prefix/usr/local/snmp BEGIN failed--compilation aborted at Makefile.PL line 1. make: *** [perlmakefiles] Error 2 yum install cpan -y make && make install /…

# [RPA] 使用八爪鱼进行高效网页数据采集

在许多行业中&#xff0c;数据是核心资产。然而&#xff0c;虽然许多网站的文本内容可以免费访问&#xff0c;但手动一条一条采集&#xff0c;不仅耗时耗力&#xff0c;还容易出错。这种情况下&#xff0c;使用自动化工具来提高采集效率就显得尤为重要。本文将介绍 八爪鱼 这一…

IDI_APPLICATION 与 IDC_ARROW资源存放在工程的哪个路径?

书籍&#xff1a;《windows程序设计(第五版)》的开始 环境&#xff1a;visual studio 2022 内容&#xff1a;HELLOWIN程序 说明&#xff1a;以下内容大部分来自腾讯元宝。 IDI_APPLICATION 和 IDC_ARROW 是 ​Windows 系统预定义的资源标识符&#xff0c;它们并不以文件形式…

算法 | 优化算法比较

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 优化算法 ‌一、主流优化算法分类‌1‌、传统梯度类算法‌2‌、启发式算…

腾讯云HAI1元体验:轻松调用DeepSeek-R1模型搭建网站

前言 随着云计算和人工智能技术的不断发展&#xff0c;构建和部署智能化的网页变得越来越简单。腾讯云提供的HAI&#xff08;人工智能平台&#xff09;和DeepSeek&#xff08;智能搜索引擎&#xff09;服务&#xff0c;能帮助开发者快速搭建智能化网页&#xff0c;提升用户体验…

AI Agent系列(七) -思维链(Chain of Thought,CoT)

AI Agent系列【七】 前言一、CoT技术详解1.1 CoT组成1.2 CoT的特点 二、CoT的作用三、CoT的好处四、CoT适用场景五、CoT的推理结构 前言 思维链(Chain of Thought,CoT)&#xff0c;思维链就是一系列中间的推理步骤(a series of intermediate reasoning steps)&#xff0c;通过…

【一起来学kubernetes】21、Secret使用详解

Secret 的详细介绍 Secret 是 Kubernetes 中用于存储和管理敏感信息&#xff08;如密码、令牌、密钥等&#xff09;的资源对象。Secret的设计目的是为了安全地存储和传输敏感信息&#xff0c;如密码、API密钥、证书等。这些信息通常不应该直接硬编码在配置文件或镜像中&#x…