Generics 在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

这是一个关于Dart泛型的问题。这个问题看起来更简单,请继续阅读

我有:

  • 类控制器使用类型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中打破这一最佳实践会让我感觉更好,因为里面有“工厂”这个词。当然,我刚才说的并不是那么重要,但我觉得第一种形式在语义上更清晰一些。严格地说,我非常同意,类不应该知道它们的子类。因此,我建议不要为
抽象类
使用
工厂
方法。这取决于谁控制子类。如果该类只有私有构造函数,因此只有基类的开发人员才能创建子类,我不会将此作为强规则。