彻底理解Dart的构造函数

如果您希望拥有更好的阅读体验,欢迎访问 我的开发笔记


Dart语言中的类

  • Dart 语言中所有的对象都是某一个类的实例,所有的类有同一个基类–Object
  • Dart 是一种面向对象的语言,并且支持基于mixin的继承方式
  • 基于mixin的继承方式具体是指:一个类可以继承自多个父类

创建对象

使用new语句来构造一个类,构造函数的名字可能是ClassName,也可以是ClassName.otherName

  var p1 = new Person("xiaoming", 20);

  var p2 = new Person.fromDictionary(dictionary)

构造函数(Constructors)

1.声明一个和类名相同的函数,来作为类的构造函数(与有名构造函数作对比,因此也可以叫作无名构造函数)
  class Person {
    String name;
    num age;
    
    Person(String name, num age) {
      this.name = name;
      this.age = age;
    }
  }

上面的代码可以简化为:

```dart
  class Person {
    String name;
    num age;
    
    Person(this.name, this.age);
  }    
```
2.命名的构造函数(Named constructors)
  class Person {
    String name;
    num age;
    
    Person.fromDictionary(Map dic) {
      this.name = dic["name"];
      this.age = dic["age"];
    }
  }    
3.子类的创建

子类不会继承父类的无名有参构造函数和命名构造函数(即子类只能继承父类无名、无参数的构造函数)

父类构造函数会在子类的构造函数前调用

默认情况下,子类只能调用父类的无名、无参数的构造函数

  class Person {
    String firstName;

    // 无参数的,非命名的构造函数
    Person() {
        print('in Person');
    }
  }

  class Son extends Person {
    // 因为父类有无参数的,非命名的构造函数,所以可以不用手动调用父类的构造函数      
    Son.fromDictionary(Map data) {
        print('in Son');
    }
  }

如果父类不显示提供无名无参的构造函数,在子类中必须手动调用父类的一个构造函数。这种情况下,调用父类的构造函数的代码放在子类构造函数名后,子类构造函数体前,中间使用 : 分隔

  class Person {
    String firstName;

    // 命名构造函数
    Person.fromDictionary(Map data) {
        print('in Person');
      }
  }

  class Son extends Person {
    // 父类没有无参数的,非命名的构造函数,所以必须手动调用一个父类的构造函数       
    Son.fromDictionary(Map data) : super.fromDictionary(data) {
        print('in Son');
    }

    //所以这种写法会报错,因为父类没有无参数的,非命名的构造函数
    Son.fromDictionary(Map data) {
        print('in Son');
    }          
  }

父类中的命名构造函数不能被子类继承。如果想要子类也拥有一个父类一样名字的构造函数,必须在子类中实现这个构造函数

4.静态构造函数(单例)

如果想要让类产生一个永远不会改变的对象,可以让这些对象成为编译时常量。为此,需要定义一个 const 构造函数并确保所有的实例变量都是 final 的

  class ImmutablePoint {
    final num x;
    final num y;

    const ImmutablePoint(this.x, this.y);
    static final ImmutablePoint origin = const ImmutablePoint(0, 0);      
  }    
5.重定向构造函数

有时候构造函数的目的只是重定向到该类的另一个构造函数。重定向构造函数没有函数体,使用冒号:分隔

  class Point {
    num x;
    num y;
    // 主构造函数
    Point(this.x, this.y) {
      print("Point($x, $y)");
    }
    // 重定向构造函数,指向主构造函数,函数体为空
    // 貌似swift中的便利构造函数,但略有不同
    Point.alongXAxis(num x) : this(x, 0);
  }

参考

Dart语法学习


如果您希望拥有更好的阅读体验,欢迎访问 我的开发笔记


你可能感兴趣的:(Flutter,Flutter,dart构造函数)