Делегирование класса репозитория нескольким Daos, которые реализуют BaseDao - возможно? - PullRequest
5 голосов
/ 12 октября 2019

У меня есть база данных Room для моего приложения Android. Мой FooDao и BarDao оба реализуют BaseDao:

interface BaseDao<T> {
    @Insert
    fun insert(obj: T): Long
    @Update
    fun update(obj: T)
}

@Dao
interface FooDao: BaseDao<FooEntity> {
    @Query("some query")
    fun doSomethingWithFoo()
}

@Dao
interface BarDao: BaseDao<BaseEntity> {
    @Query("some other query")
    fun doSomethingWithBar()
}

У меня также есть класс репозитория:

class MyRepo(private val fooDao: FooDao, private val barDao: BarDao) {
    fun doSomethingWithFoo() = fooDao.doSomethingWithFoo()
    fun doSomethingWithBar() = barDao.doSomethingWithBar()
}

Но представьте, что FooDao, BarDao и MyRepo имеют гораздо больше, чем только эти дваfunctions.

Я узнал о делегировании классов, чтобы включить композиционное наследование. Таким образом, я пытаюсь уменьшить шаблон в MyRepo, передав ему простые функции, которые просто вызывают функцию дао и возвращают возвращаемое значение дао. Это имеет смысл, что я должен сделать:

class MyRepo(...): FooDao by fooDao, BarDao by barDao {
    //fun doSomethingWithFoo no longer necessary
    //fun doSomethingWithBar no longer necessary
}

Тем не менее, Android Studio дает мне красную волнистую поговорку Type parameter T of BaseDao has inconsistent values: FooEntity, BarEntity

Означает ли это, что вся надежда потеряна для сокращения всего этого шаблона как MyRepo.doSomethingWithFoo = fooDao.doSomethignWithFoo? Или есть способ сделать это?

Я пытался переопределить функции BaseDao в MyRepo, думая, что это перестанет жаловаться на FooEntity и BarEntity:

class MyRepo(...): BaseDao<Any>, SetDao by setDao, ... {
    override fun insert(t: Any): Long = 0L
}

, но это просто добавляет "Любой"к сообщению о несовместимых типах.

...