如何用不可为空的飞镖覆盖可为空的字段
How to override nullable field with non-nullable one dart
我有一个 class 和一个可为 null 的 属性。我想制作一个 superclass 用一个不可空的
覆盖 属性
所以
class Example {
String? name;
}
class NamedExample extends Example {
@override
String name;
}
有什么办法吗?如果不是,这个目标通常是如何实现的。
我基本上想要两个相同的 class,除了其中一个总是有一个 属性 而另一个是可选的。
这是 covariant
关键字的位置。通常用参数的子类型覆盖参数的类型是没有意义的,这样做是无效的。这个关键字告诉分析器这是有意的。它可以添加到超类或子类中。
子类:
class Example {
String? name;
}
class NamedExample extends Example {
@override
covariant String name;
NamedExample(this.name);
}
超类:
class Example {
covariant String? name;
}
class NamedExample extends Example {
@override
String name;
NamedExample(this.name);
}
你不能用 String name
覆盖 String? name
成员的原因是因为它可能违反基础 class 中 setter 的合同,因此可能不安全。基地 class 宣传:
var example = Example();
example.name = null;
是合法的。但是,如果 example
是 NamedExample
的实例,则 example.name = null
赋值将不再合法。 covariant
关键字禁用此安全检查并相信您在实践中永远不会执行此类分配。
一般来说,你应该avoid overriding fields。
如果您的 classes 只暴露一个 getter,您 可以 安全地覆盖。以下两个示例都是合法且安全的:
class Example {
String? _optionalName;
String? get name => _optionalName;
}
class NamedExample extends Example {
NamedExample(this._requiredName);
String _requiredName;
@override
String get name => _requiredName;
}
或
class Example {
Example([this.name]);
final String? name;
}
class NamedExample extends Example {
NamedExample(this.name);
@override
final String name;
}
我有一个 class 和一个可为 null 的 属性。我想制作一个 superclass 用一个不可空的
覆盖 属性所以
class Example {
String? name;
}
class NamedExample extends Example {
@override
String name;
}
有什么办法吗?如果不是,这个目标通常是如何实现的。
我基本上想要两个相同的 class,除了其中一个总是有一个 属性 而另一个是可选的。
这是 covariant
关键字的位置。通常用参数的子类型覆盖参数的类型是没有意义的,这样做是无效的。这个关键字告诉分析器这是有意的。它可以添加到超类或子类中。
子类:
class Example {
String? name;
}
class NamedExample extends Example {
@override
covariant String name;
NamedExample(this.name);
}
超类:
class Example {
covariant String? name;
}
class NamedExample extends Example {
@override
String name;
NamedExample(this.name);
}
你不能用 String name
覆盖 String? name
成员的原因是因为它可能违反基础 class 中 setter 的合同,因此可能不安全。基地 class 宣传:
var example = Example();
example.name = null;
是合法的。但是,如果 example
是 NamedExample
的实例,则 example.name = null
赋值将不再合法。 covariant
关键字禁用此安全检查并相信您在实践中永远不会执行此类分配。
一般来说,你应该avoid overriding fields。
如果您的 classes 只暴露一个 getter,您 可以 安全地覆盖。以下两个示例都是合法且安全的:
class Example {
String? _optionalName;
String? get name => _optionalName;
}
class NamedExample extends Example {
NamedExample(this._requiredName);
String _requiredName;
@override
String get name => _requiredName;
}
或
class Example {
Example([this.name]);
final String? name;
}
class NamedExample extends Example {
NamedExample(this.name);
@override
final String name;
}