如何使用空安全和实例化更新 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;