微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用空安全和实例化更新 Dart 的工厂构造函数?

如何解决如何使用空安全和实例化更新 Dart 的工厂构造函数?

我有一个对我来说似乎很简单的问题;然而,我想不通。

我一直在用一些过时的书来学习 Dart。可以理解的是,我遇到了一个我无法解决的问题。我正在阅读的书是 Alessandro Biessek (2019) 在工厂构造函数部分下的“初学者的颤振”。以下代码来自本书(第 48-49 页):

class Student extends Person {
Student(firstName,lastName) : super (firstName,lastName);
}

class Employee extends Person {
Employee(firstName,lastName);
}

class Person {
  String firstName;
  String lastName;
  
  Person([this.firstName,this.lastName]);
  
  factory Person.fromType([PersonType type]){
    switch(type){
      case PersonType.employee:
        return Employee();
      case PersonType.student:
        return Student();
    }
    return Person();
  }
  
  String getfullName() => '$firstName $lastName';
}

enum PersonType { student,employee}

我的问题:

  1. 如何更新此代码以使其成为空安全?
  2. 如何实例化代码?我如何成为学生或雇员?我脑子里一片空白。
  3. 工厂构造函数的使用频率如何?

我尝试过的: 1a) 我试图设置参数 firstName 和 lastName = ''。 1b) 我还尝试从构造函数和工厂构造函数删除 []。 2)我不明白如何实例化一个工厂人。但是,我尝试了以下方法来实例化它:

void main() {
Person.fromType(PersonType.employee)
  ..firstName = 'Clark'
  ..lastName = 'Kent';
}

在 DartPad 中没有成功。

任何帮助将不胜感激。

解决方法

由于您的类属性可以是null,因此您需要添加?。 您代码中的另一个问题是 StudentEmployee 有一个带有两个参数的构造函数,但在您的 factory Person.fromType 中,您不带任何参数调用它。

class Person {
  String? firstName;
  String? lastName;
  
  Person([this.firstName,this.lastName]);
  
  factory Person.fromType(Person person,[PersonType? type]){
    switch(type){
      case PersonType.employee:
        return Employee(person.firstName,person.lastName);
      case PersonType.student:
        return Student(person.firstName,person.lastName);
      default:
        return person;
    }
 
  }
  
  String getfullName() => '$firstName $lastName';
}
final Person person = Person('FirstName','LastName');
  
final Student student = Person.fromType(Person('WithoutLastName'),PersonType.student) as Student;
  
final Employee employee = Person.fromType(person,PersonType.employee) as Employee;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。