如何解决继承 Dart Null Safety 以实现可测试性
我有一个关于 Dart Null 安全概念的问题。
假设我有一个名为 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 部分作为我的默认值。此外,另一个程序员可能认为这是一个可选参数,因为我没有将其标记为必需,这可能会导致错误。
那么,解决这种情况的最佳做法是什么?
解决方法
您可以使用命名参数构造函数来使字符可选,也可以像这样删除 late
和 ?
class Bird{
Object character;
Bird(Object character) : this.character = character ?? GetIt.I<Object>();
}
您的命名参数构造函数将如下所示
class Bird{
Object character;
Bird({this.character = DEFAULT_CONST_VALUE});
}
,
这个解决方案怎么样?
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 {
//
}
,
您需要使用如下命名的构造函数
class Bird{
Object character;
Bird({this.character});
Bird withCharater(Object character) {
return Bird(character: character);
}
}
class Pigeon extends Bird{
String name;
Pigeon();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。