0

我有一个与 Dart Null Safety 概念相关的问题。

想象一下,我有一个名为Bird的课程

class Bird{
Object character;

Bird();
}

鸽子

class Pigeon extends Bird{
String name;

Pigeon();
}

现在,由于 Dart 上的 Null Safety,必须实例化角色对象。我想在构造函数中实例化它,因为我希望鸟类可以使用 Mockito 进行测试。

但是,当我写这篇

class Bird{
late Object character;

Bird(this.character);
}

Pigeon 类显示错误,因为Bird 类没有任何零参数构造函数。

我的解决方法是使用这样的不需要的参数。

class Bird{
late Object character;

Bird({Object? character}) : this.character= character ?? GetIt.I<Object>();;
}

但是,我不喜欢 GetIt 部分作为我的默认值。此外,另一个程序员可能认为这是一个可选参数,因为我没有将它标记为必需,这可能会导致错误。

那么,解决这种情况的最佳实践是什么?

4

3 回答 3

0

您需要使用命名构造函数,如下所示

class Bird{
 Object character;
  
 Bird({this.character});
  
 Bird withCharater(Object character) {
   return Bird(character: character);
 }
}

class Pigeon extends Bird{
 String name;

 Pigeon(); 
}
于 2021-01-17T11:38:36.797 回答
0

这个解决方案怎么样?

class Bird {
  Object character;

  Bird({this.character});
}

class Pigeon extends Bird {
  String name;

  Pigeon({this.name, Object character}) : super(character: character);
}

甚至这个?

class Bird<T> {
  T character;

  Bird({this.character});
}

class Pigeon extends Bird<String> {
  String name;

  Pigeon({this.name, String character}) : super(character: character);
}

或这个?

class Character {
  //
}

class Bird<T extends Character> {
  T character;

  Bird({this.character});
}

class Pigeon extends Bird<PigeonCharacter> {
  String name;

  Pigeon({this.name, PigeonCharacter character}) : super(character: character);
}

class PigeonCharacter extends Character {
  //
}
于 2021-01-17T09:08:28.027 回答
0

您可以使用命名参数构造函数使字符可选或删除late?就像这样

class Bird{
  Object character;

  Bird(Object character) : this.character = character ?? GetIt.I<Object>();
}

您的命名参数构造函数将如下所示

class Bird{
  Object character;

  Bird({this.character = DEFAULT_CONST_VALUE});
}
于 2021-01-17T09:03:08.583 回答