如何在Dart中创建支持任意合规类的泛型API函数?
实现适配任意规则类的泛型API解决方案
1. 定义约束抽象类
先创建一个抽象类,强制所有适配类实现toDocument实例方法,同时约定fromDocument的构造规范:
abstract class DocumentSerializable { Map<String, String> toDocument(); // 可选:用工厂构造器约束结构,子类需实现该工厂方法 factory DocumentSerializable.fromDocument(Map<String, String> data) => throw UnimplementedError(); }
2. 实现适配类
让所有需要适配的类实现上述抽象类,同时完成fromDocument(静态方法或工厂构造器)和toDocument的实现:
class User implements DocumentSerializable { final String name; final String id; User(this.name, this.id); static User fromDocument(Map<String, String> data) { return User(data['name']!, data['id']!); } @override Map<String, String> toDocument() { return {'name': name, 'id': id}; } } class Product implements DocumentSerializable { final String productId; final String price; Product(this.productId, this.price); static Product fromDocument(Map<String, String> data) { return Product(data['productId']!, data['price']!); } @override Map<String, String> toDocument() { return {'productId': productId, 'price': price}; } }
3. 编写泛型上传/获取函数
上传函数(类型安全)
用泛型约束限制参数必须是DocumentSerializable子类,编译时即可校验是否符合规则,避免dynamic的类型风险:
void uploadModel<T extends DocumentSerializable>(T instance) { server.upload(instance.toDocument()); }
获取函数(解决静态方法调用问题)
Dart无法直接通过泛型类型参数调用静态方法,因此我们通过传递fromDocument函数作为参数来构建实例:
先定义类型别名简化函数签名:
typedef FromDocument<T> = T Function(Map<String, String> data);
再实现泛型获取函数:
T getModel<T extends DocumentSerializable>(String id, FromDocument<T> fromDocument) { Map<String, String> data = server.getData(id); return fromDocument(data); }
4. 使用示例
// 上传实例 final user = User('Alice', 'user_001'); uploadModel(user); // 获取实例 final fetchedUser = getModel('user_001', User.fromDocument); final fetchedProduct = getModel('prod_100', Product.fromDocument);
核心优势
- 类型安全:泛型约束确保只有符合规则的类能被传入,编译阶段即可发现错误
- 通用性:一套API适配所有实现
DocumentSerializable的类 - 简洁性:调用方式直观,无需额外类型转换
内容的提问来源于stack exchange,提问作者Saeed isa
相关产品推荐
相关产品推荐

