Generics 在Dart中,子类如何扩展超类,让泛型类型的子类扩展超类类型?
这是一个关于Dart泛型的问题。这个问题看起来更简单,请继续阅读 我有:Generics 在Dart中,子类如何扩展超类,让泛型类型的子类扩展超类类型?,generics,dart,flutter,Generics,Dart,Flutter,这是一个关于Dart泛型的问题。这个问题看起来更简单,请继续阅读 我有: 类控制器使用类型T 类ExtendedController使用类型S ExtendedController扩展SomeController S延伸T 以下代码不起作用: import 'package:flutter/material.dart'; class SomeValue {} class ExtendedValue extends SomeValue {} abstract class SomeCont
- 类控制器使用类型T
- 类ExtendedController使用类型S
- ExtendedController扩展SomeController
- S延伸T
import 'package:flutter/material.dart';
class SomeValue {}
class ExtendedValue extends SomeValue {}
abstract class SomeController<T extends SomeValue> extends ValueNotifier<T> {
SomeController(T value) : super(value);
factory SomeController.create() {
return ExtendedController();
}
}
class ExtendedController extends SomeController<ExtendedValue> {
ExtendedController() : super(ExtendedValue());
}
import 'package:flutter/material.dart';
class SomeValue {}
class ExtendedValue extends SomeValue {}
abstract class SomeController<T extends SomeValue> extends ValueNotifier<T> {
SomeController(T value) : super(value);
factory SomeController.create() {
return ExtendedController();
}
}
class ExtendedController<S extends ExtendedValue> extends SomeController<S> {
ExtendedController() : super(ExtendedValue());
}
仍然不起作用,但现在我遇到另一个错误:
构造函数返回的“ExtendedValue”类型不是预期的类型。
这一次在
super(ExtendedValue())中代码>行。让我们来看第一个错误:
返回类型“ExtendedController”不是方法“create”定义的“SomeController”。
根据定义,它告诉ExtendedController
不是create
方法中的预期返回类型
create
在这里是一种工厂方法,它希望返回类型为SomeController
factory SomeController.create() {
return SomeController();
}
我们不能这样更改,因为SomeController
是一个抽象类。
因此,我将factory
方法移动到ExtendedController
class SomeValue {}
class ExtendedValue extends SomeValue {}
abstract class SomeController<T extends SomeValue> extends ValueNotifier<T> {
SomeController(T value) : super(value);
}
class ExtendedController extends SomeController {
ExtendedController(ExtendedValue value) : super(value);
factory ExtendedController.create() {
return ExtendedController(ExtendedValue());
}
}
class SomeValue{}
类ExtendedValue扩展SomeValue{}
抽象类SomeController扩展了ValueNotifier{
SomeController(T值):超级(值);
}
类ExtendedController扩展SomeController{
ExtendedController(ExtendedValue值):超级(值);
factory ExtendedController.create(){
返回ExtendedController(ExtendedValue());
}
}
希望我的解释能在一定程度上有所帮助。一个明确的演员阵容可以解决这个问题:
factory SomeController.create() {
return ExtendedController() as SomeController<T>;
}
factory SomeController.create(){
将ExtendedController()作为SomeController返回;
}
或者,您可以使用
static create() {
return ExtendedController() as SomeController<T>;
}
静态创建(){
将ExtendedController()作为SomeController返回;
}
有了可选的new
就没有什么区别了。我的例子就是简化。在实际代码中,有许多扩展控制器类,工厂根据传递给它的参数选择其中一个返回。有趣的是,使用可选的new,实际上已经没有什么区别了。严格地说,类不应该知道它们的子类,如果这是Java,我将创建一个单独的SomeControllerFactory类来封装返回SomeController的一个子类的逻辑。我想在Dart中打破这一最佳实践会让我感觉更好,因为里面有“工厂”这个词。当然,我刚才说的并不是那么重要,但我觉得第一种形式在语义上更清晰一些。严格地说,我非常同意,类不应该知道它们的子类。因此,我建议不要为抽象类
使用工厂
方法。这取决于谁控制子类。如果该类只有私有构造函数,因此只有基类的开发人员才能创建子类,我不会将此作为强规则。