0

似たような質問がたくさんありますが、探しているものを正確に説明するものを見つけるのに苦労しています

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. 格納されたプロパティ宣言を 1 か所に保持し、init

  2. クラスのジェネリック型。プロトコルを介してそれを維持するのは簡単ではないようです

しかし、この現在のソリューションの問題は、

  1. 誰にも実際にインスタンスをインスタンス化させたくない場合は、「抽象」クラスが公開されます
  2. eventReceivedHandlerコンパイラによって強制されません

ここに正しい解決策はありますか?このアーキテクチャは十分に一般的であると思いましたが、オンラインで何かを見つけるのに本当に苦労していました。私の検索クエリには、使い古された用語が多すぎます

4

2 に答える 2