Я рекомендую использовать общий интерфейс для обоих классов. Если они предоставляются сторонней библиотекой, вы можете обернуть их в свои собственные классы и интерфейс.
Если вы не хотите этого делать, вы можете просто проверить тип параметра в storeUser
function:
fun storeUser(datastore: Any) {
when(datastore) {
is DataStore1 -> datastore.storeName("John")
is DataStore2 -> datastore.storeName("John")
else -> throw IllegalArgumentException()
}
}
Но учтите, что если в будущем у вас будет другое хранилище данных, вам нужно будет добавить еще одно предложение is
к этой функции. Это делает этот код не очень удобным в обслуживании ...
Лучшее решение
Если вы создаете интерфейс Datastore
:
interface Datastore {
fun storeName(name: String)
}
и сделайте так, чтобы ваши хранилища данных реализовали это:
class Datastore1 : Datastore {
//Datastore1.storeName implementation
}
class Datastore2 : Datastore {
//Datastore2.storeName implementation
}
Тогда вам не нужно проверять типы в функции storeUser
. Просто измените его тип параметра на Datastore
:
fun storeUser(datastore: Datastore) {
datastore.storeName("John")
}
Если Datastore1 и Datastore2 предоставлены сторонней библиотекой , вы можете обернуть их в свои собственные классы и реализовать свои Datastore
интерфейс:
class FirstDatastore : Datastore {
private val datastore = DataStore1()
override fun storeName(name: String) {
datastore.storeName(name)
}
}
class SecondDatastore : Datastore {
private val datastore = DataStore2()
override fun storeName(name: String) {
datastore.storeName(name)
}
}
Итак, вы можете вызывать свою функцию, используя свои классы:
val datastore1 = FirstDatastore()
storeUser(datastore1)
val datastore2 = SecondDatastore()
storeUser(datastore2)