flutter 达特延拓法

3pmvbmvn  于 2023-10-22  发布在  Flutter
关注(0)|答案(1)|浏览(99)

有一个Person类,以及Person类的扩展,如下所示:

class Person {
  bool get isEmpty{
    return this == null;
  }
}

extension PersonExt on Person {
  bool get isEmptyByExt {
    return this == null;
  }
}

通话内容如下:

Person person;
var result = person.isEmptyByExt;
print(result);
var result2 = person.isEmpty; // ERROR
print(result2);

person.isEmptyByExt;通话没有问题;
但是person.isEmpty;将在此处报告错误:

NoSuchMethodError: The getter 'isEmpty' was called on null.
Receiver: null
Tried calling: isEmpty

为什么?为什么?

c0vxltue

c0vxltue1#

调用示例方法涉及虚拟分派,并且需要一个实际的对象示例进行继承,方法重写在运行时才能工作。在示例方法中,this永远不会是null
扩展方法是静态函数的语法糖,使它们看起来像示例方法。即:

extension PersonExt on Person {
  bool get isEmptyByExt {
    return this == null;
  }
}

本质上等同于:

class PersonExt {
  static bool isEmptyByExt(Person _this) {
    return _this == null;
  }
}

它们处理对象的静态(编译时已知)类型,而不是对象的实际运行时类型。(这就是为什么扩展方法不能在dynamic类型上工作,并且它们不能被派生类重写。)由于它们等价于static函数,因此对象可以是null
请注意,启用null-safety后,这一点会更清楚一些,其中存在以下区别:

  • extension PersonExt on Personthis不能是null
  • extension PersonExt on Person?this * 可以 * 是null)。

进一步阅读:Dart Extension Methods Fundamentals

相关问题