有很多类似的问题,但我很难找到能准确解释我正在寻找的东西
我有多个Services
,它处理一个泛型Data
类型。他们目前都是半“抽象”类的子类,DataService
这是因为所有这些Services
都具有相同的存储属性:
class DataService<T: Data> {
let id: String
let eventDataProviders: [EventDataProvider]
private let storedDataProviders: [StoredDataProvider]
它们init
也是一样的:
init(id: String, eventDataProviders: [EventDataProvider], storedDataProviders: [StoredDataProvider]) {
self.id = id
self.storedDataProviders = storedDataProviders
self.eventDataProviders = eventDataProviders
self.setupStoredDataProviders()
self.setupEventDataProviders()
}
setup
方法也一样
这些类之间的区别在于它们如何处理数据,目前在“抽象”函数中定义
func eventReceivedHandler() -> ((T) -> Void) {
fatalError("DataService does not have eventReceivedHandler defined")
}
大多数资源都推荐协议和协议扩展。我也更喜欢哪个,但我认为让这变得困难的两件事是:
试图通过将存储的属性声明保存在一个地方并共享一个
init
类上的泛型类型,通过协议维护它似乎并不简单
但是当前解决方案的问题是
- 当我们不希望任何人实际实例化一个实例时,“抽象”类就暴露了
eventReceivedHandler
不是编译器强制执行的
这里有正确的解决方案吗?我认为这种架构可能很常见,但我真的一直在努力在网上寻找任何东西,我的搜索查询包含太多过度使用的术语