代码之家  ›  专栏  ›  技术社区  ›  Marcelo Glasberg

在Dart中,子类如何扩展一个超类,子类的泛型类型如何扩展一个超类类型?

  •  2
  • Marcelo Glasberg  · 技术社区  · 6 年前

    这是一个 问题。这个问题比看上去简单,请继续读下去。

    我有:

    • 类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());
    }
    

    我得到一个错误:

    The return type 'ExtendedController' isn't a 'SomeController<T>', as defined by the method 'create'.

    return ExtendedController(); 线路。

    然后我把它改成:

    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());
    }
    

    仍然不起作用,但现在我得到另一个错误: The constructor returns type 'ExtendedValue' that isn't of expected type 'S'.

    这次是在 super(ExtendedValue()); 线路。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Günter Zöchbauer    6 年前

    显式强制转换修复了它:

      factory SomeController.create() {
        return ExtendedController() as SomeController<T>;
      }
    

    https://groups.google.com/a/dartlang.org/forum/#!topic/misc/bVRHdagR8Tw

    或者你可以使用

      static create() {
        return ExtendedController() as SomeController<T>;
      }
    

    new 已经没有什么区别了。

        2
  •  1
  •   Dinesh Balasubramanian    6 年前

    我们来看第一个错误: The return type 'ExtendedController' isn't a 'SomeController<T>', as defined by the method 'create'.

    这说明问题 ExtendedController 不是预期的返回类型 create 方法符合定义。

    创造 工厂 方法,并期望返回类型为 SomeController

    factory SomeController.create() {
      return SomeController();
    }
    

    我们也不能像这样改变 SomeController公司 班级。 所以,我搬家了 factory 方法来扩展控制器。

    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());
      }
    }
    

    希望我的解释能有所帮助。