Dart:子类同方法仅返回类型不同,如何移至基类实现代码复用?
如何将子类中逻辑相同但返回类型不同的方法移到基类?
当然可以把这个方法放到基类里,但你之前的写法错误在于:this.runtimeType是运行时才确定的类型对象,并非编译时的静态类型,所以不能用它来做类型转换。下面提供两种可行的方案:
方案一:泛型基类 + 抽象创建方法
这是最优雅的方式,通过泛型让基类明确知道子类的类型,同时让子类负责创建自身实例:
class Base<T extends Base<T>> { T doSomething() { // 这里写所有子类共享的公共逻辑 print("执行公共操作"); return _createInstance(); } // 子类必须实现这个方法,返回自身的实例 T _createInstance(); } class SubclassOne extends Base<SubclassOne> { @override SubclassOne _createInstance() { return SubclassOne(); } } class SubclassTwo extends Base<SubclassTwo> { @override SubclassTwo _createInstance() { return SubclassTwo(); } }
这样调用SubclassOne().doSomething()时,返回的类型就是SubclassOne,完全符合需求,公共逻辑也只需要写一次。
方案二:利用返回类型协变
Dart支持返回类型协变,也就是子类重写基类方法时,可以返回更具体的类型。这种方式不需要泛型,只需要基类定义抽象的创建方法:
class Base { Base doSomething() { // 公共逻辑 print("执行公共操作"); return _createInstance(); } Base _createInstance(); } class SubclassOne extends Base { @override SubclassOne _createInstance() { return SubclassOne(); } } class SubclassTwo extends Base { @override SubclassTwo _createInstance() { return SubclassTwo(); } }
这种写法下,调用SubclassOne().doSomething()会自动推断返回类型为SubclassOne,不需要额外的类型转换。
为什么你的原写法不行?
this.runtimeType是一个运行时的Type对象,代表当前实例的类型,但编译器在编译阶段无法确定它的具体类型,所以不能用as this.runtimeType来做类型转换——编译器根本不知道这个"类型"是什么,自然会报错。
内容的提问来源于stack exchange,提问作者Bryant
相关产品推荐
相关产品推荐

