Flutter——dart 面向对象(二)

1. 工厂构造&单例对象&初始化列表

在Dart中创建单例,这样的话就是在方法里面调用自己,肯定是不行的。

class FactoryClass {
  //需要一个单例对象
  static FactoryClass? _instance;
  FactoryClass(){
    _instance ??= FactoryClass();
  }
}

复制代码

这时候就要用到命名构造函数。

class FactoryClass {
  //需要一个单例对象
  static FactoryClass? _instance;
  FactoryClass(){
    _instance ??= FactoryClass._init();
  }

  FactoryClass._init();
}
复制代码

在dart中的构造函数是没有返回对象的,如果需要返回对象,则需要在方法前面加factory。这里因为_instancenullability所以需要强制解包

class FactoryClass {
  //需要一个单例对象
  static FactoryClass? _instance;
  factory FactoryClass(){
    _instance ??= FactoryClass._init();
    return _instance!;
  }

  FactoryClass._init();
}
复制代码

工厂方法还可以优化一下

factory FactoryClass(){
    return _instance ??= FactoryClass._init();
  }
  // 甚至
    factory FactoryClass() =>  _instance ??= FactoryClass._init();
复制代码

这样就成功创建了一个单例。 在Dart中,还有一个叫初始化列表的东西。初始化列表会在构造函数运行之前对属性进行赋值(需要注意的是,初始化变量的右侧不能访问this)。

初始化列表作用

  • 给final 变量赋值
  • 校验传递的值
class Person {
  String name;
  int age;
  final height;

  Person(this.name,this.age,int h):
      height = h, assert(h>=0){
    print('name: $name, age:$age,height:$height');
  }

}
复制代码

当传入的height小于0的时候就会报错。

在这里插入图片描述

2.类方法&对象操作符

在Dart中,静态属性和静态方法(也就是类方法)使用static修饰。

class StaticClass {
  //静态属性
  static int count = 1;
  // 静态方法
  static int sum (int a ){
    return a + count;
  }
}
复制代码

属性赋值和方法的调用需要用类而不是对象。

  StaticClass.count = 10;
  StaticClass.sum(20);
复制代码

要注意的是类方法里面是无法访问非静态属性的,但是实例方法里面是可以访问静态属性的。这是因为静态方法是通过类对象来调用的,在类对象调用之前,实例对象有可能是不存在的,那么实例属性和方法就不存在所以无法访问。但是实例方法通过实例对象访问,实例对象创造出来之后类对象是一定加载进去了的,所以就可以访问静态属性和方法。 在这里插入图片描述 常量属性必须用static修饰否则会报错。

  static const int age = 10;
复制代码

在使用对象的时候,有可能出现对象为空的情况,这时候如果调用方法,那么就会报错。

var s1;
s1= StaticClass();
s1 = null;
s1.sum2();
复制代码

为了安全起见,可以在对象后面加上?后调用方法,也就是:

s1?.sum2()
复制代码

这个时候如果对象为空,那么就会得到null。

这个时候s1的类型就会变为Object,调用StaticClass 类中的方法就会报错。

在这里插入图片描述

这时候需要进行类型强转。

在这里插入图片描述

或者进行类型判断。

void staticDemo() {
var s1 = Object();
s1= StaticClass();
if (s1 is StaticClass) {
  s1.total();
}
}
复制代码

猜你喜欢

转载自juejin.im/post/7013638352293494814