Dart整理

Dart构造函数

  • 普通构造函数和命名构造函数
  1. 默认构造函数
    一个类没有声明构造函数,默认会有一个无参构造函数,声明了有参的构造函数或者命名的构造函数,则就没有默认的无参构造函数
  2. 如果父类拥有无参构造函数,子类的所有构造函数都默认继承这一个无参构造,除非手动指定继承其他构造函数
  3. 如果父类没有无参构造函数,有带参构造或者命名构造函数,那么子类的构造函数必须手动指定所继承的父类构造函数
  4. 命名构造函数不可继承,如果子类想要有和父类一样的命名构造函数,那就写个同名的
class Person {
  int age;
  String name;

  Person(int age, String name) {
    this.age = age;
    this.name = name;
  }
 
}
   //语法糖
  Person(this.age, this.name);

// 命名构造函数
  Person.init() {
  //没有歧义时 省略this
    age = 0;
    name = '';
  }
class Son extends Person{
  int sonAge;
  String sonName;
// 因为父类没有默认构造函数 所以子类必须显示声明无参构造函数且必须继承父类
Son():super.init();
}
  • 初始化列表
class Son extends Person {
  String sonName;

  Son(Map map)
      : sonName = map["studentNum"],
        super(map["age"], map["name"]) {
    print(
        "this is a Son-> sonName = ${this.sonName}, age = ${this
            .age},name = ${this.name}");
  }
}
// 在其他函数中调用 Son(map); sonName 会被赋值
  • 常量构造函数
  1. 如果你的类,创建的对象永远不会改变,你可以在编译期就创建这个常量实例,并且定义一个常量构造函数,并且确保所有的成员变量都是final的
 class ImmutablePoint {
  static final ImmutablePoint origin =
      const ImmutablePoint(0, 0);

  final num x, y;

  const ImmutablePoint(this.x, this.y);
}
  • 工厂构造函数
  1. 有时候可能有一种需求,并不需要每次都创建新的类实例,而是每一种情况,只需要一个实例
  2. factory修饰的构造函数的名称必须是该类的类名
class FactoryClass {
  final String name;


  static final Map _cache =
      {};

  factory FactoryClass(String name) {
    if (_cache.containsKey(name)) {
      return _cache[name];
    } else {
      final object = FactoryClass._internal(name);
      _cache[name] = object;
      return object;
    }
  }

  FactoryClass._internal(this.name);

}

你可能感兴趣的:(Dart整理)