Flutter Dart类

news2024/11/24 2:16:57

目录

构造函数

命名构造函数

重定向构造函数

常量构造函数

工厂构造函数

Getters 和 Setters

初始化列表

可覆写的操作符


        创建一个dart文件,名称全小写,里面的类可以按照驼峰命名法。文件名和类名可以不保持统一,这个跟Java有明显区别。

        Dart是一种面向对象的语言,具有类和基于mixin的继承。每个对象都是一个类的实例,所有的类都是Object的子类。基于mixin的继承意味着,尽管每个类(除了Object)都只有一个超类,但类主体可以在多个类层次结构中重用

        示例中向你展示了一个包含2个属性、2个构造函数以及1个函数的类。

//每个实例变量都会自动生成一个 getter 方法(隐含的)。 非final 实例变量还会自动生成一个 setter 方法。

class SccPoint{
  late num x;
  num y;
  //构造函数
  SccPoint(this.x,this.y);

  //命名构造函数
  //Dart 不支持构造函数的重载
  SccPoint.y(this.y){
    x = 0;
  }
  //函数
  void position(){
    print("x=$x,y=$y");
  }
}

构造函数

        由于把构造函数参数赋值给实例变量的场景太常见了, Dart 提供了一个语法糖来简化这个操作:

  //构造函数
  SccPoint(this.x,this.y);

命名构造函数

        Dart 不支持构造函数的重载,而采用了命名构造函数为一个类实现多个构造函数:

  //命名构造函数
  //Dart 不支持构造函数的重载
  SccPoint.y(this.y){
    x = 0;
  }

「运行结果」

重定向构造函数

        有时候一个构造函数会调动类中的其他构造函数(在Java中就是 this(...))。 一个重定向构造函数是没有代码的,在构造函数声明后,使用 冒号调用其他构造函数。

class SccPoint{
  num x;
  num y;
  //构造函数
  SccPoint(this.x,this.y);

  //命名构造函数
  SccPoint.y(num y):this(0,y);//调用上面的构造函数

}

常量构造函数

        如果你的类提供一个状态不变的对象,你可以把这些对象 定义为编译时常量。要实现这个功能,需要定义一个 const 构造函数, 并且声明所有类的变量为 final

class ImmutablePoint {
  final num x;
  final num y;
  //常量构造函数
  const ImmutablePoint(this.x, this.y);
}

void main(){
  //构造两个相同的编译时常量会生成一个单一的、规范的实例
  var p3 = const ImmutablePoint(1,2);
  var p4 = const ImmutablePoint(1,2);
  print(p3 == p4); // true
  print(identical(p3, p4));// true
}

工厂构造函数

        当实现一个使用 factory 关键词修饰的构造函数时,这个构造函数不必创建类的新实例。例如,一个工厂构造函数 可能从缓存中获取一个实例并返回,或者 返回一个子类型的实例。(工厂构造函数无法访问 this

class Logger {
  final String name;
  bool mute = false;

  // _cache 变量是库私有的,因为在其名字前面有下划线。
  static final Map<String, Logger> _cache =
  <String, Logger>{};

  factory Logger(String name) {
    return _cache.putIfAbsent(
        name, () => Logger._internal(name)); //工厂构造函数里可以调用其他构造函数。
  }

  factory Logger.fromJson(Map<String, Object> json) {
    return Logger(json['name'].toString());
  }
  //以 _ 开头的函数是库私有的,无法在库外使用
  Logger._internal(this.name);

  void log(String msg) {
    if (!mute) print(msg);
  }
}

        借助工厂构造函数能够实现单例:

//使用工厂构造实现单例
class Manager {
  static final Manager _singleton = Manager._internal();

  factory Manager() {
    return _singleton;
  }
  Manager._internal();
}

//使用
  var m1 = Manager();
  var m2 = Manager();
  print(m1 == m2); // true

Getters 和 Setters

        Dart中每个实例变量都隐含的具有一个 getter, 如果变量不是 final 的则还有一个 setter。可以通过实现 getter 和 setter 来创建新的属性, 使用 getset 关键字定义 getter 和 setter:

class SccPoint{
  num x;
  num y;
  SccPoint(this.x,this.y);
  void position(){
    print("x=$x,y=$y,a=$a");
  }
  //使用 get定义了一个 a 属性(不可与原属性同名)
  num get a   => x+y;
  set a(num b) => x=x+b;
}

void main() {
  var p9 = SccPoint(3, 9);
  p9.position();//x=3,y=9,a=12
  p9.a=10;
  p9.position();//x=13,y=9,a=22
}
 

注意:在get与set中使用自身会导致Stack Overflow(递归)

调用自身:

初始化列表

        在构造函数函数体执行之前会首先执行初始化列表,非常适合用来设置 final 变量的值。

class SccPoint{
  num? x;
  num? y;
  SccPoint.fromJson(Map<String, num> json)
      : x = json['x'],
        y = json['y'] {
    print('In SccPoint.fromJson(): ($x, $y)');
  }

}

  //使用
  SccPoint.fromJson({"x":15,"y":20});

可覆写的操作符

        把已经定义的、有一定功能的操作符进行重新定义。可以重新定义的操作符有:

<+|[]
>/^[]=
<=~/&~
>=*<<==
%>>

        比如:dart.math包下Point类就重写了 +、-、*、==这几个操作符。

  Point<T> operator +(Point<T> other) {
    return Point<T>((x + other.x) as T, (y + other.y) as T);
  }
  Point<T> operator *(num /*T|int*/ factor) {
    return Point<T>((x * factor) as T, (y * factor) as T);
  }

        操作符重载函数的名字是“关键字 operator +以及紧跟其后的一个 Dart 预定义的操作符。

class SccPoint{
  num x;
  num y;
  SccPoint(this.x,this.y);
  //加
  SccPoint operator +(SccPoint point){
    return SccPoint(x+point.x,y+point.y);
  }
  //乘
  SccPoint operator *(SccPoint point){
    return SccPoint(x*point.x,y*point.y);
  }
  void position(){
    print("x=$x,y=$y");
  }
}

使用

//导入类文件(最好全路径),看起来直观一些
import 'package:flutter_demo_scc/scc_point.dart';

//导入类文件(相对路径),两种都可以
// import 'scc_point.dart';

void main() {
  var p5 = SccPoint(3, 5);
  var p6 = SccPoint(2, 7);
  var p7 = p5+p6;
  var p8 = p5*p6;
  p5.position();//x=3,y=5
  p6.position();//x=2,y=7
  p7.position();//x=5,y=12
  p8.position();//x=6,y=35
}

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

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

相关文章

Scrapy: 一个强大的 Python 爬虫框架--介绍--下载--启动!!

目录 Scrapy 影响力 介绍 主要特点 架构 运行流程 基本使用 安装 创建 Scrapy 项目 创建爬虫 爬虫包含的内容 运行爬虫 Scrapy 影响力 作为目前爬虫主流框架之一&#xff0c;Scrapy的影响力和应用范围非常广泛&#xff1a; 根据GitHub上的数据&#xff0c;Scrapy是一…

ERR! code ERR_SOCKET_TIMEOUT

问题 安装npm包&#xff0c;终端报错ERR! code ERR_SOCKET_TIMEOUT ERR! code ERR_SOCKET_TIMEOUT详细问题 笔者运行以下命令重新安装依赖项&#xff1a; npm install控制台报错&#xff0c;具体报错信息如下 npm ERR! code ERR_SOCKET_TIMEOUT npm ERR! network Socket t…

【C++】【VLD】VLD检测内存泄漏

【C】【VLD】VLD检测内存泄漏 C/C 程序越复杂&#xff0c;内存的管理显得越重要&#xff0c;稍有不慎就会出现泄漏。如果内存泄漏不是很严重&#xff0c;在短时间内对程序不会有太大影响&#xff0c;这也使得内存泄漏问题有很强的隐蔽性&#xff0c;不易被发现。 然而不管内存…

计算机网络——传输层

序言 计算机网络中的传输层在当今的社会起到了什么作用&#xff1f; 计算机网络中的传输层在通信和数据传输方面起着至关重要的作用。传输层是计算机网络体系结构中的一层&#xff0c;它负责提供端到端的可靠数据传输和通信服务&#xff1b;有着以下几个方面作用&#xff1a;可…

3-css高级特效-2

01-空间转换 空间转换简介 空间&#xff1a;是从坐标轴角度定义的 X 、Y 和 Z 三条坐标轴构成了一个立体空间&#xff0c;Z 轴位置与视线方向相同。空间转换也叫 3D转换属性&#xff1a;transform 平移 transform: translate3d(x, y, z); transform: translateX(); transfor…

chatgpt赋能python:Python聊天机器人程序:把智能带入聊天

Python聊天机器人程序&#xff1a;把智能带入聊天 在数字化时代&#xff0c;机器人指引和客户服务变得越来越流行。为了快速而有效地满足这种需求&#xff0c;聊天机器人被广泛研究与开发。Python是在这方面一个非常受欢迎的编程语言&#xff0c;能够快速地构建聊天机器人。在…

【C++】win 10 / win 11:Visual Studio 2022 社区版免费下载与安装

目录 一、Visual Studio 2022 下载 二、Visual Studio 2022 安装 三、Visual Studio 2022 快捷方式创建 四、Visual Studio 2022 使用 一、Visual Studio 2022 下载 Visual Studio 2022 官方下载https://visualstudio.microsoft.com/zh-hans/downloads/首先登陆 Visual Stu…

基于Java医院在线挂号预约系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Jmeter简单实现登录测试

目录 前言&#xff1a; 1、添加线程组--在测试计划上右击-添加-Threads-线程组 2、添加http请求默认值--在线程组上右击-添加-配置元器件-http请求默认值 3、添加sampler-http请求-登录界面 4、添加sampler-http请求-登录-携带用户名和密码 5、创建存放用户名和密码的文件…

数通王国历险记之TCP协议下的三大协议的验证实验

系列文章目录 数通王国历险记&#xff08;1&#xff09; 前言 一&#xff0c;我们要先知道PDU是什么&#xff1f; 二、TCP协议下的三大协议的验证实验 1.FTP的验证实验 1&#xff0c;拓扑图 2.将lsw4配置一下 3&#xff0c;FTP服务器端开启FTP服务&#xff1a; 4&#x…

SpringBoot 如何使用 TestEntityManager 进行 JPA 集成测试

SpringBoot 如何使用 TestEntityManager 进行 JPA 集成测试 简介 在开发过程中&#xff0c;JPA 是常用的持久化框架之一&#xff0c;它可以帮助我们将对象映射到数据库中&#xff0c;并提供了一系列操作数据库的 API。在进行 JPA 的开发和测试时&#xff0c;我们通常会使用一…

Mybatis实现分页功能

1、关于逻辑分类和物理分页 分页可分为逻辑分页和物理分页 逻辑分页是一次性把全部数据查询加载进内存 &#xff0c;然后再进行分页。这样优点是减少IO次数&#xff0c;适合频繁访问、数据量少的情况。缺点是不适合大数据量&#xff0c;容易造成内存溢出。物理分页是利用limi…

Android JVM 原理简析

当我们在开发 Android 应用程序时&#xff0c;我们实际上是在使用 Java 编程语言编写代码&#xff0c;并将其编译为在 Android 上运行的字节码。这些字节码最终在 Android 设备上的 Java 虚拟机&#xff08;JVM&#xff09;中执行。 Android JVM的意义 学习 Android JVM&#…

Java基础知识面试题

Java概述 何为编程 编程就是使用某种程序设计语言编写程序代码让计算机解决某个问题 为了使计算机能够理解人的意图&#xff0c;人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机&#xff0c;使得计算机能够根据人的指令一步一步去工作&a…

Spring相关API

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;JavaEE、Spring SpringAPI 1、继承体系2、 getBean() 1、继承体系 上述继承体系中的主要类和接口包括&#xff1…

WebRTC-STUN协议详解

1、STUN协议概述 STUN&#xff08;Session Traversal Utilities for NAT&#xff09;NAT会话穿透工具&#xff0c;STUN是一个Client/Server协议&#xff0c;支持请求/响应类型、指示类型两种类型。STUN作为ICE&#xff08;Interactive Connectivity Establishment&#xff0c;…

【需求实现】输入多少就输出多少的拟合任务如何实现(一):数据集分割

神经网络中输入多少数据就输出多少数据的情况如何实现 导读数据集长什么样&#xff1f;怎么分割数据集&#xff1f;时间窗口分析模板我知道你很急&#xff0c;但你先别急 换个思路 导读 在实习的过程中遇到了这样一种需求&#xff1a;给定一条序列&#xff0c;并另外给定一条期…

使用ffmpeg将rtsp流转流实现h5端播放

主要实现rtsp转tcp协议视频流播放 ffmpeg下载安装&#xff08;公认业界视频处理大佬&#xff09; a、官网地址&#xff1a;www.ffmpeg.org/ b、gitHub&#xff1a;github.com/FFmpeg/FFmp… c、推荐下载地址&#xff1a;ffmpeg.zeranoe.com/builds/ (选择如下图) 2.配置ffmpeg…

期末复习【计算机系统结构】

期末复习【计算机系统结构】 前言推荐押题公式 期末复习重点第1章 计算机体系结构的基本概念1.3 定量分析技术1.3.1计算机系统设计的定量原理 第2章 计算机指令集结构第3章 流水线技术3.2 流水线的性能指标3.2.1 吞吐率3.2.2 加速比3.2.3 效率3.2.4 流水线性能分析举例 3.3 流水…

miniconda的安装

1. conda 是一个开源的包、环境管理器&#xff0c;可以用于在同一个机器上安装不同版本的软件包及其依赖&#xff0c;并能够在不同的环境之间切换。 miniconda官网下载 miniconda清华镜像下载 找到自己想要安装的版本&#xff0c;我这里选择的是Miniconda3-4.7.12.1-Linux-x…