▩Dart-五例知识点

例子一:

class Bicycle {
  int cadence;
  int speed;
  int gear;
}
main() {}

有什么问题吗?

提示:
非空实例字段‘cadence’必须初始化。
➀尝试添加一个初始值,或➁创建一个构造函数去初始化它,或➂标记它为late

现添加一个构造函数,来完成Bicycle类字段的初始化:

Bicycle(this.cadence, this.speed, this.gear);// 这个构造函数没有函数体,这在Dart中是有效的。

这样就不再报错了:

上面构造函数的等效代码如下(用了初始化列表的方式):

Bicycle(int cadence, int speed, int gear) : this.cadence=cadence, this.speed=speed, this.gear=gear;
main() {
	var bike = Bicycle(2, 0, 1);// 在Dart2中`new`关键字是可选的!
	print(bike);// 打印:Instance of 'Bicycle'
}

可以重写Object类的toString()方法,让打印信息更清晰:

@override
String toString() => 'Bicycle: $speed mph';

例子二:

import 'dart:math';
abstract class Shape {// 显示接口定义
  num get area;// this interface must be implemented
}
class Circle implements Shape {
  final num radius;
  Circle(this.radius);
  num get area => pi * pow(radius, 2);// must implement interface
}
class Square implements Shape {
  final num side;
  Square(this.side);
  num get area => pow(side, 2);// must implement interface
}
main() {
  final circle = Circle(2);
  final square = Square(2);
  print(circle.area);// 12.566370614359172
  print(square.area);// 4
}

对比如下 1 vs 2:

  1. 创建一个顶级函数:
Shape shapeFactory(String type) {
    if (type == 'circle') return Circle(2);
    if (type == 'square') return Square(2);
    throw 'Can\'t create $type.';// 也可以用双引号:"can't create $type."
}
main() {
    final circle = shapeFactory('circle');
    final square = shapeFactory('square');
}
  1. 创建一个工厂构造函数:
abstract class Shape {
  factory Shape(String type) {
      if (type == 'circle') return Circle(2);
      if (type == 'square') return Square(2);
      throw 'Can\'t create $type.';
  }
  num get area;
}
main() {
    final circle = Shape('circle');
    final square = Shape('square');
}

例子三:

class CircleMock implements Circle {}

会报错,根据IDE提示,生成:

class CircleMock implements Circle {
  @override
  // TODO: implement area
  num get area => throw UnimplementedError();

  @override
  // TODO: implement radius
  num get radius => throw UnimplementedError();
}

如果这样,也是不报错的:

class CircleMock implements Circle {
  @override
  num area = 0;
  @override
  num radius = 0;
}

即使CircleMock类没有定义任何行为,但它是有效的Dart,分析器不会引发错误。
实际上是CircleMock的实例变量area实现了Circle里area的getter方法。对于radius也一样。否则@override也不可能加上去。

例子四:

String scream(int length) => "A${'a' * length}h!";
main() {
  final values = [1, 2, 3, 5, 10, 50];
  for (var length in values) {
    print(scream(length));
  }
}

输出:

Aah!
Aaah!
Aaaah!
Aaaaaah!
Aaaaaaaaaaah!
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah!

注:‘a’ * 6 = 6个连续的’a’ = “aaaaaa”,即,字符’a’被重复6次!

将命令式代码转换为函数式代码:
将例子的for循环,改为如下,效果一样,也是打印同样的输出:

values.map(scream).forEach(print);

map()、forEach()原型(针对本例而言):
dart:core Iterable map (T Function(int) toElement)
dart:core void forEach(void Function(String) action)

例子五:
使用更多的迭代器特性。ListIterable类支持fold()where()join()skip()等等。Dart也有maps和sets的内置支持。

values.skip(1).take(3).map(scream).forEach(print);

输出:

Aaah!
Aaaah!
Aaaaaah!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itzyjr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值