如何在 Dart 中为容器 class 指定数据类型
How to specify a data type for a container class in Dart
我正在寻找 dart 语法来实现以下但不知道搜索答案的正确术语是什么。
class BaseClass <T extends MyType> {
List<T> items;
T getFirstItem() => items.first;
}
然后可以像这样子class
class ClassForMyType<MyType> extends BaseClass {
List<MyType> items;
MyType getFirstItem() => items.first;
}
ClassForMyType 将扩展 BaseClass,这样我就不必重新实现人为的 getFirstItem()
方法。
实际上我希望能够像这样使用它:
ClassForMyType container = ClassForMyType();
MyType item = Mytype();
container.items.add(item);
List<MyType> itemsFromContainer = container.items;
MyType firstItem = container.getFirstItem();
我试过这样的方法:
BaseClass<T extends MyType> {
List<T> items;
void addItemFromMap(Map map) {
items.add(T.fromMap(map));
}
}
上述方法在 MyType 中确实存在的 .fromMap() 上失败。在我访问 MyType 上的其他方法的其他方法中,这些方法似乎有效,但似乎只有命名的构造函数才有问题。
我认为唯一可行且看起来相对不错的方法是:
abstract class BaseClass<T extends MyType> {
List<T> items;
// abstract factory method
T itemFromMap(Map map);
void addItemFromMap(Map map) {
items.add(itemFromMap(map));
}
}
class ClassForMyType extends BaseClass<MyType> {
// implementing abstract factory method, delegating call to constructor
MyType itemFromMap(Map map) => MyType.fromMap(map);
}
我同意,你应该在每个子类中实现工厂方法有点开销,但这是唯一正确的方法。
我正在寻找 dart 语法来实现以下但不知道搜索答案的正确术语是什么。
class BaseClass <T extends MyType> {
List<T> items;
T getFirstItem() => items.first;
}
然后可以像这样子class
class ClassForMyType<MyType> extends BaseClass {
List<MyType> items;
MyType getFirstItem() => items.first;
}
ClassForMyType 将扩展 BaseClass,这样我就不必重新实现人为的 getFirstItem()
方法。
实际上我希望能够像这样使用它:
ClassForMyType container = ClassForMyType();
MyType item = Mytype();
container.items.add(item);
List<MyType> itemsFromContainer = container.items;
MyType firstItem = container.getFirstItem();
我试过这样的方法:
BaseClass<T extends MyType> {
List<T> items;
void addItemFromMap(Map map) {
items.add(T.fromMap(map));
}
}
上述方法在 MyType 中确实存在的 .fromMap() 上失败。在我访问 MyType 上的其他方法的其他方法中,这些方法似乎有效,但似乎只有命名的构造函数才有问题。
我认为唯一可行且看起来相对不错的方法是:
abstract class BaseClass<T extends MyType> {
List<T> items;
// abstract factory method
T itemFromMap(Map map);
void addItemFromMap(Map map) {
items.add(itemFromMap(map));
}
}
class ClassForMyType extends BaseClass<MyType> {
// implementing abstract factory method, delegating call to constructor
MyType itemFromMap(Map map) => MyType.fromMap(map);
}
我同意,你应该在每个子类中实现工厂方法有点开销,但这是唯一正确的方法。