简体   繁体   English

Inheritance on Dart Null 可测试性安全

[英]Inheritance on Dart Null Safety for testability

I have a question related to Dart Null Safety concept.我有一个与 Dart Null 安全概念有关的问题。

Imagine I have a class called Bird想象一下,我有一个名为Bird的 class

class Bird{
Object character;

Bird();
}

and Pigeon鸽子

class Pigeon extends Bird{
String name;

Pigeon();
}

Now, because of Null Safety on Dart, the character object must be instantiated.现在,由于 Dart 上的 Null 安全性,必须实例化字符 object。 I want to instantiate that in the constructor because I want the bird class can be testable using Mockito.我想在构造函数中实例化它,因为我希望鸟 class 可以使用 Mockito 进行测试。

But, when I wrote this但是,当我写这篇

class Bird{
late Object character;

Bird(this.character);
}

The Pigeon class shows an error because the Bird class doesn't have any zero-argument constructor. Pigeon class 显示错误,因为Bird class 没有任何零参数构造函数。

My workaround is by using a not required argument like this.我的解决方法是使用这样的不需要的参数。

class Bird{
late Object character;

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

But, I don't like the GetIt part for my default value.但是,我不喜欢 GetIt 部分作为我的默认值。 Moreover, another programmer may think it is an optional argument because I didn't mark it as required which can lead to an error.此外,另一个程序员可能认为这是一个可选参数,因为我没有将它标记为必需,这可能会导致错误。

So, how is the best practice to solve this case?那么,解决这种情况的最佳实践是什么?

You can either use Named Argument Constructor to make character optional or remove late and ?您可以使用命名参数构造函数使字符可选或删除late? like this像这样

class Bird{
  Object character;

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

Your Named Argument Constructor will look like this您的命名参数构造函数将如下所示

class Bird{
  Object character;

  Bird({this.character = DEFAULT_CONST_VALUE});
}

What about this solution?这个解决方案怎么样?

class Bird {
  Object character;

  Bird({this.character});
}

class Pigeon extends Bird {
  String name;

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

Or even this?甚至这个?

class Bird<T> {
  T character;

  Bird({this.character});
}

class Pigeon extends Bird<String> {
  String name;

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

Or this?或这个?

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 {
  //
}

You need to use the named constructor as below您需要使用命名构造函数,如下所示

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

class Pigeon extends Bird{
 String name;

 Pigeon(); 
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM