dart - 具有通用工厂的 Dart 抽象类
问题描述
我有一个泛型类型的抽象类。我希望这个类定义一个工厂,所以如果一个实现类没有定义这个,它会给出一个警告。但是,当使用泛型类型时,我无法弄清楚如何做到这一点。抽象类只是不断给我错误。
这是我的课程,其中包含一些非工作解决方案的示例:
abstract class Bar<T> {
// Error: The class 'Bar' doesn't have a default constructor
factory Bar.someFn(Map<String, dynamic> myMap) => Bar<T>(myMap);
// Error 1: The name of a factory constructor must be the same as the name of the immediately enclosing class
// Error 2: 'T' isn't a function.
// Error 3: Try correcting the name to match an existing function, or define a method or function named 'T'
factory T.someFn(Map<String, dynamic> myMap) => T(myMap);
}
拥有一个正确的抽象类将产生以下结果:
// BAD!
class Foo implements Bar<Foo> {
// Missing implementation of someFn
}
// OK!
class Foo implements Bar<Foo> {
@override
factory Foo.someFn(Map<String, dynamic> myMap) => Foo(x: myMap['x'], y: myMap['y']);
}
有没有办法实现我想要的?
解决方案
不。
构造函数不是继承的,它们不是任何接口的一部分,因此您在超类中编写的任何内容都不会影响子类的构造函数。
每个类都可以定义自己的构造函数。您唯一能做的就是向超类添加一个生成构造函数,然后扩展超类(不仅仅是实现其接口)的子类将不得不调用该超类构造函数作为它们的超构造函数调用。
推荐阅读
- angular - 如何在 Angular 2+ 的 JSON 文件中创建和存储数据?
- smtp - Laravel 5.6 SMTP 邮件在本地发送,但在实时服务器上不起作用
- c# - 对“MustHaveHappenedOnceExactly”的多个调用进行单元测试
- javascript - 有没有办法将 es6 vue 文件转换为 es5 vue 文件?
- xml - 使用 Powershell foreach 读取 XML 数据并赋值给变量
- javascript - 当按下“i”键时,jQuery 强制 html5 视频播放“画中画”
- javascript - 移动范围并得到相反的结果
- api - 通过 api 将内部版本号作为 json 参数发送来获取 jenkins 作业的控制台输出
- regex - 使用正则表达式对字符串分隔符进行递归匹配
- javascript - `function(*=)` 在 JSDoc 风格的代码注释中意味着什么?