Dart(6)类

2019-12-31  本文已影响0人  谜夨_

类的定义和使用,构造函数,对象的类型

void main() {
  var p = Point(2, 3); //省略了new
  p.showPoint(); //x is 2,y is 3
  p?.x = 5; //如果P不是null 给 X赋值5
  p.showPoint(); //x is 5,y is 3

  //null判断
  Point nullPoint;
  nullPoint?.x = 6; //nullPoint 空不执行
  nullPoint?.showPoint(); //

  //类型
  print(p.runtimeType); // Animal

  //构造函数
  var p2 = Point.createInstance({"x": 1, "y": 2});
  print(p2);//Instance of 'Point'
  p2.showPoint();//x is 1,y is 2
}

class Point {
  num x, y;

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

//   另外一种
//   Point(num x, num y) {
//     this.x = x;
//     this.y = y;
//   }

  // 命名构造函数
  Point.createInstance(Map values) {
    x = values["x"];
    y = values["y"];
  }

  showPoint() {
    print("x is $x,y is $y");
  }
}

记住构造函数是不能被继承的,这将意味着子类不能继承父类的命名式构造函数,如果你想在子类中提供一个与父类命名构造函数名字一样的命名构造函数,则需要在子类中显式地声明。

调用父类非默认构造函数

默认情况下,子类的构造函数会调用父类的匿名无参数构造方法,并且该调用会在子类构造函数的函数体代码执行前,如果子类构造函数还有一个,那么该初始化列表会在调用父类的该构造函数之前被执行,总的来说,这三者的调用顺序如下:

  1. 初始化列表
  2. 父类的无参数构造函数
  3. 当前类的构造函数

如果父类没有匿名无参数构造函数,那么子类必须调用父类的其中一个构造函数,为子类的构造函数指定一个父类的构造函数只需在构造函数体前使用(:)指定。

常量构造函数

class Point {
  static final Point origin =  const Point (0, 0);

  final num x, y;

  const Point (this.x, this.y);
}

工厂构造函数

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

  static final Map<String, Logger> _cache = <String, Logger>{};
  Logger._internal(this.name);

  factory Logger(String name) {
    return _cache.putIfAbsent(name, () => Logger._internal(name));
  }

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

main() {
  var logger = Logger('UI');
  logger.log('Button clicked');
}

抽象类和抽象方法

使用关键字 abstract 标识类可以让该类成为 抽象类,抽象类将无法被实例化。抽象类常用于声明接口方法、有时也会有具体的方法实现。如果想让抽象类同时可被实例化,可以为其定义工厂构造函数。

实例方法、Getter 方法以及 Setter 方法都可以是抽象的,定义一个接口方法而不去做具体的实现让实现它的类去实现该方法,抽象方法只能存在于抽象类中。

abstract class Player {
  // 定义实例变量和方法等等
  void playerSwitch(); // 定义一个抽象方法
}

class EffectivePlayer extends Player {
  void playerSwitch() {
    // 实现
  }
}

重写

上一篇下一篇

猜你喜欢

热点阅读