2017-05-29 27 views
3

是否可以使用下面的AsyncResult类来防止在UserDataAppResult和CreateUserResult中重新定义InFlight,Error和InFlight?如何使密封类在kotlin中通用?

//TODO: use this to make the below classes generic? 
sealed class AsyncResult{ 
    object InFlight : AsyncResult() 
    data class Error(val errorMessage: String) : AsyncResult() 
    data class Loaded<out T>(val users: T) : AsyncResult() 
} 

sealed class UserDataAppResult : AppResult() { 
    object InFlight : UserDataAppResult() 
    data class Error(val errorMessage: String) : UserDataAppResult() 
    data class Loaded(val users: List<User>) : UserDataAppResult() 
} 

sealed class CreateUserResult : AppResult() { 
    object InFlight : CreateUserResult() 
    data class Error(val errorMessage: String) : CreateUserResult() 
    data class Loaded(val users: User) : CreateUserResult() 
} 

上面的代码可能看起来像这样吗?

sealed class AsyncResult{ 
    class InFlight : AsyncResult() 
    data class Error(val errorMessage: String) : AsyncResult() 
    data class Loaded<out T>(val users: T) : AsyncResult() 
} 

sealed class UserDataAppResult : AsyncResult() 
sealed class CreateUserResult : AppResult() 

val activeUsers: Flowable<UserDataAppResult> = appDatabase.userDao().getActiveUsers(appSettings.currentLanguage.ordinal) 
    .map<UserDataAppResult> { UserDataAppResult.Loaded(it) } 
    .onErrorReturn { UserDataAppResult.Error(it.localizedMessage) } 
    .startWith(UserDataAppResult.InFlight) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .share() 

fun createUser(): Flowable<CreateUserResult> { 

    val userId = UUID.randomUUID().toString() 
    val user = User() 
    user.id = userId 
    return appDatabase.userDao().insertAll(user) 
     .map <CreateUserResult> { CreateUserResult.Loaded(user) } 
     .onErrorReturn { CreateUserResult.Error(it.localizedMessage) } 
     .startWith(CreateUserResult.InFlight) 
} 

当前UserDataAppResult.Error没有找到,这是有道理的。 但是可以重用AppResult密封类层次结构并引入新类型。

回答

1

这在Kotlin中是不可能的。你使用的每种类型都必须有明确声明的类。即使在超类中声明嵌套类时,编译器也不会隐式创建类。我建议你重写代码,将两个基于继承的层次结构合并为两个合并继承和合成中的一个,或者只是以某种方式重构层次结构,例如(我假设一个确切的如果不是Loaded):

sealed class AsyncResult { 
    object InFlight : AsyncResult() 
    data class Error(val errorMessage: String) : AsyncResult() 
    sealed class Loaded<out T>(val result: T) : AsyncResult() { 
     sealed class UserDataAppResult(users: List<User>) : Loaded<List<User>>(users) 
     sealed class CreateUserResult(user: User) : Loaded<User>(user) 
    } 
} 
+0

谢谢,我会尝试一下你的方法,看看我如何继续下去。 –