似たような質問がたくさんありますが、探しているものを正確に説明するものを見つけるのに苦労しています
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")
}
ほとんどのリソースは、プロトコルとプロトコル拡張を推奨しています。私もどちらを好むかですが、それを難しくしている 2 つの点は次のとおりだと思います。
格納されたプロパティ宣言を 1 か所に保持し、
init
クラスのジェネリック型。プロトコルを介してそれを維持するのは簡単ではないようです
しかし、この現在のソリューションの問題は、
- 誰にも実際にインスタンスをインスタンス化させたくない場合は、「抽象」クラスが公開されます
- は
eventReceivedHandler
コンパイラによって強制されません
ここに正しい解決策はありますか?このアーキテクチャは十分に一般的であると思いましたが、オンラインで何かを見つけるのに本当に苦労していました。私の検索クエリには、使い古された用語が多すぎます