首页 > 其他分享 >Flutter/Dart第14天:Dart类详解

Flutter/Dart第14天:Dart类详解

时间:2023-10-21 19:11:06浏览次数:35  
标签:const 14 Point 对象 Dart var 构造函数 Flutter 变量

Dart官方文档:https://dart.dev/language/classes

重要说明:本博客基于Dart官网文档,但并不是简单的对官网进行翻译,在覆盖核心功能情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。

Dart类

Dart语言基于Mixin继承,是一门面向对象语言。任何对象都是某个类的实例,除Null之外,Object类其他所有类的父类。

Mixin继承:Dart语言和Java语言一样,类只能是单继承。但通过Mixin,一个类的代码可以在多个类层次结构中复用(有关Minxin的详细说明见之前文章:https://ntopic.cn/p/2023093001)。

方法扩展:在不改变原有类和增加子类的情况之下,通过Dart的方法扩展,可以给类增加功能的一种方法(这个特性在Flutter发布的库特别有用)。

类修饰符:可以让我们可控制一个库如果定义子类。

类成员(方法和变量)

对象是由函数和数据组成,分别代码方法和变量。我们通过对象.方法或者对象.变量的方法来访问对象方法和变量。当对象可能为null时,通过对象.?访问方法和变量的方式可防止异常发生。

// 定义对象
var p = Point(2, 2);

// 获取对象变量`y`
assert(p.y == 2);

// 调用对象方法:`distanceTo()`
double distance = p.distanceTo(Point(4, 4));

// 当对象`p`非空时,`a`值为变量`y`;否则`a`值为null
var a = p?.y;

类构造函数

在前面学习中,我们对构造函数有初步认识:https://ntopic.cn/p/2023092401

如下代码样例,可以通过主构造函数和命名构造函数创建一个对象;构造函数之前,我们也可以增加可选的new关键字:

var p1 = Point(2, 2);
var p2 = Point.fromJson({'x': 1, 'y': 2});

// 同上等价代码,可选的`new`关键字
var p1 = new Point(2, 2);
var p2 = new Point.fromJson({'x': 1, 'y': 2});

当类的变量都用final不可变修饰时,我们可以构造常量对象:

var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);

// 对象`a`和`b`相等
assert(identical(a, b));

对于一个常量上下文,我们可以去掉构造函数之前的const关键字。如下代码样例,我们定义的是一个常量Map(上下文),那么Map元素的构造器就可以省略const关键字:

const pointAndLine = const {
  'point': const [const ImmutablePoint(0, 0)],
  'line': const [const ImmutablePoint(1, 10), const ImmutablePoint(-2, 11)],
};

// 同上等价代码,可省略`const`关键字
const pointAndLine = {
  'point': [ImmutablePoint(0, 0)],
  'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
};

如果一个对象没有常量上下文,且没有使用const修饰构造器,那么它创建的是一个非常量对象:

var a = const ImmutablePoint(1, 1);
var b = ImmutablePoint(1, 1);

// `a`是常量对象,`b`不是常量对象,因此它们不相等!
assert(!identical(a, b));

获取对象类型

通过对象.runtimeType属性,返回对象的Type对象。一般情况下,我们通过对象 is Type的方法,检测某个对象是否属于某个类型,而不是使用对象.runtimeType == Type比较方式:

print('The type of a is ${a.runtimeType}');

var a = 'Hello NTopicCN';
assert(a.runtimeType == String);
assert(a is String);

实例变量

如下代码定义样例,申明实例变量,实例变量的默认值为null

class Point {
  double? x; // 默认值:null
  double? y; // 默认值:null
  double z = 0; // 默认值:0
}

所有的实例变量都隐含有一个getter方法,包括final修饰的变量未使用final修饰的变量late final修饰的变量(赋值和未赋值)等,都有getter方法。

如下代码样例,几种实例变量修饰和访问的方法:

class Point {
  double? x;
  double? y;
}

void main() {
  var point = Point();
  point.x = 4; // `setter`方法赋值
  assert(point.x == 4); // `getter`方法取值
  assert(point.y == null); // 默认值为`null`
}

class ProfileMark {
  final String name;
  final DateTime start = DateTime.now();

  // 主构造函数
  ProfileMark(this.name);

  // 命名构造函数,同时`name`设置初始值
  ProfileMark.unnamed() : name = '';
}

隐性接口

在Dart中,每个类都隐含的定义了一个接口,这个接口包含了该类的所有实例成员和该类实现的所有的其他接口。

假设我们定义了一个类A,它需要支持类B的API(构造函数不是API),但是类A的定义并不是继承类B,那么类A需要实现B接口。

// `Person`类,也是`Persion`接口,包含`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'))); // Hello, Bob. I am Kathy.
  print(greetBob(Impostor())); // Hi Bob. Do you know who I am?
}

类变量和方法

static关键字,可以定义类变量和方法(Java中成为静态变量和静态方法)。

如下代码样例,定义和使用一个类变量:

class Queue {
  static const initialCapacity = 16;
  // ···
}

void main() {
  assert(Queue.initialCapacity == 16);
}

如下代码样例,定义和使用类方法:

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);
}

最佳实践:对于一些常用的工具方法,建议使用顶级方法代替类变量。

类方法可以用作编译期常量,比如:我们可以把一个类方法当作参数传递给常量构造器。


我的本博客原地址:https://ntopic.cn/p/2023102001


标签:const,14,Point,对象,Dart,var,构造函数,Flutter,变量
From: https://www.cnblogs.com/obullxl/p/NTopic2023102001.html

相关文章

  • 20231405罗马数字转阿拉伯数字(选做)
    罗马数字转阿拉伯数字(选做)任务详情参考https://blog.csdn.net/a197p/article/details/75475456,回答1罗马数字是位置计数吗?它的缺点是什么?2把你的8位学号转化成罗马数字3参考上面的博客,用Pyhton写一个罗马数字转化为阿拉伯数字的程序,并验证上面你的学号对不对作业一 位......
  • Flutter的Invalid use of a private type in a public API警告
    问题描述自己在写Flutter应用时发现了一个InvaliduseofaprivatetypeinapublicAPI警告。发现很多官方的例子也有这个问题。有问题的源码有问题的源码如下:classMyTabPageextendsStatefulWidget{constMyTabPage({super.key});@override_MyTabPageState......
  • 20231405寻找你的黑客偶像(选做)
    寻找你的黑客偶像(选做)一.黑客偶像袁仁广别名:大兔子(datuzi),人称袁哥。提起袁任广,知道的人或许并不多。但如果提起袁哥或者大兔子,在国内安全业界称得上尽人皆知。在国内,他的windows系统方面的造诣可谓首屈一指,早在1999年就曾提出过windows的共享漏洞。而现在袁仁广领衔的360漏......
  • 2023-2024-1 20231404高伟光 《计算机基础与程序设计》第四周学习总结
    作业信息所属班级计算机基础与程序设计作业要求要求作业目标学习并总结课本,通过测试作业正文本博客教材学习内容总结1.学习了门与电路的相关知识,了解了相关运算与图解2.知道大多计算机为冯-诺伊曼体系3.学习了强转,了解计算机赋值逻辑和晕算符号教材学......
  • Sodick 沙迪克 LP20EH3 P12S14 成型机 注塑机 配置网络ip 备忘
    型号:LP20EH3 P12S14Sodick沙迪克LP20EH3 P12S14成型机注塑机配置网络ip备忘 ......
  • React学习笔记14-dangerousSetinnerHtml指令
    1.使用场景dangerouslySetInnerHTML指令能将字符串当做html解析相当于vue中的v-html指令一般我们用来渲染富文本返回的html文本2.使用方法{this.state.tolist.map((item,index)=>{return(<spandangerouslySetInnerHTML={{__html:item}}ke......
  • Educational Codeforces Round 149 (Rated for Div. 2)
    这场D被切穿了。A题答案为x或者x-11B题答案就是最长的连续一段的长度+1证明的话大概可以将它看成是几段连续上升和下降的段,然后在峰谷、峰顶分别填上最小、最大,剩下的就依次递增或递减就行。C题将一段连续的0/1视作一个块,那么我们最小化这个块的数量就行。D题如果猜到......
  • Electron VS Flutter非全面比较,看看哪个阵营适合你
    前言Electron和Flutter是两种流行的跨平台应用开发框架。它们都可以用于构建桌面应用程序,但是在技术架构和开发经验方面存在一些区别。架构Electron:Electron是一个基于Chromium和Node.js的开源框架,允许使用Web技术(HTML、CSS和JavaScript)构建跨平台桌面应用程序。它使用主进程和渲染......
  • 14代酷睿i9/i7选它挺好!微星MPG B760M EDGE TI WIFI 刀锋 钛 主板评测:仅1399元 降压能
    一、前言:能满足绝大多数玩家需求的B760M主板如果是以前,我们会推荐顶级的Z790主板来搭配酷睿14代i9和i7的K系列处理器,但在测试了这块微星MPGB760MEDGETIWIFI主板之后,我们改变了原先的看法。这是因为这块1399元的B760主板,不论是降压能力还是内存支持,都完全不输给5000元级的......
  • Flutter开发--新建项目中4种Project Type区别
     Projectflutter项目,里面有iOS、Android目录Moduleflutter模块,原生iOS项目,想加flutter功能开发Pluginflutter插件,原生flutter项目,想加iOS功能开发Package纯flutter项目,没有iOS、Android目录 https://www.jianshu.com/p/01972bf7cb97......