前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Kotlin] 密封类总结

[Kotlin] 密封类总结

原创
作者头像
用户3702315
修改2021-04-01 14:12:44
1K0
修改2021-04-01 14:12:44
举报
文章被收录于专栏:安卓开发
简介

sealed 修饰的类称为密封类,用来表示受限的类层次结构。

案例
代码语言:txt
复制
// 外部无法实例化密封的类
// 外部只能实例化他的子类
sealed class Color {
    // 只能在内部继承密封类
    class Red(val value: Int) : Color()
    class Green(val value: Int) : Color()
    class Blue(val name: String) : Color()
}

fun isInstance(color: Color) {
    when (color) {
        // 必须写全所有条件,否则报错
        is Color.Red -> TODO()
        is Color.Green -> TODO()
        is Color.Blue -> TODO()
    }
}
案例
代码语言:txt
复制
// 默认情况下,密封类的构造函数是私有的。
// 密封类的所有子类必须在同一文件中声明。
sealed class A {
    class B : A() {
        // this works.
        class E : A()
    }

    class C : A()
 
    init {
        println("sealed class A")
    } 
}
 
//this works 
class D : A() {
    // This won't work. Since sealed class is defined in another scope.
    class F: A() 
}
案例
代码语言:txt
复制
// 在密封的类中添加数据类和对象 
sealed class A {
    class B : A()
    class C : A()

    object D : A() {
         fun name() {
             println("Object D")
         }
    }

    data class E(var name: String) : A()
}
演示
代码语言:txt
复制
sealed class NetworkResult<out T> {
    data class Success<out T>(val value: T) : NetworkResult<T>()
    data class Failure(val throwable: Throwable?) : NetworkResult<Nothing>()
}

when (result) {
    is PokemonResult.Failure -> {
        // 进行失败提示
    }
    is PokemonResult.Success -> {
        // 进行成功处理
    }
}
代码语言:txt
复制
sealed class PrchaseResult {
    sealed class GoogplayBilling: PrchaseResult(){
        data class Sucess(val purchseToken : String) : GoogplayBilling()
        data class Fail(val error : String) : GoogplayBilling()
        object Retry : GoogplayBilling()
        sealed class PurchaseAcknowledgement : GoogplayBilling(){
            object Sucess : PurchaseAcknowledgement()
            data class Fail(val errorCode : Int) : PurchaseAcknowledgement()
        }
    }
 
    sealed class Stripe: PrchaseResult(){
        data class Sucess(val purchseToken : String) : Stripe()
        data class Fail(val error : String) : Stripe()
        object Retry : Stripe()
        sealed class PurchaseAcknowledgement : Stripe(){
            object Sucess : PurchaseAcknowledgement()
            data class Fail(val errorCode : Int) : PurchaseAcknowledgement()
        }
    }
 
    sealed class PayYouMoney: PrchaseResult(){
        data class Sucess(val purchseToken : String) : PayYouMoney()
        data class Fail(val error : String) : PayYouMoney()
        object Retry : PayYouMoney()
        sealed class PurchaseAcknowledgement : PayYouMoney(){
            object Sucess : PurchaseAcknowledgement()
            data class Fail(val errorCode : Int) : PurchaseAcknowledgement()
        }
    }
}

when(signal){
    // GooglePlay Billing related
    is PrchaseResult.GoogplayBilling.Sucess -> { }
    is PrchaseResult.GoogplayBilling.Fail -> { }
    is PrchaseResult.GoogplayBilling.Retry -> { }
    is PrchaseResult.GoogplayBilling.PurchaseAcknowledgement.Sucess -
    is PrchaseResult.GoogplayBilling.PurchaseAcknowledgement.Fail -> 
    // PayYouMoney Billing related
    is PrchaseResult.PayYouMoney.Sucess -> { }
    is PrchaseResult.PayYouMoney.Fail -> { }
    is PrchaseResult.PayYouMoney.Retry -> { }
    is PrchaseResult.PayYouMoney.PurchaseAcknowledgement.Sucess -> { }
    is PrchaseResult.PayYouMoney.PurchaseAcknowledgement.Fail -> { }
    // PayYouMoney Billing related
    is PrchaseResult.Stripe.Sucess -> { }
    is PrchaseResult.Stripe.Fail -> { }
    is PrchaseResult.Stripe.Retry -> { }
    is PrchaseResult.Stripe.PurchaseAcknowledgement.Sucess -> { }
    is PrchaseResult.Stripe.PurchaseAcknowledgement.Fail -> { }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 案例
  • 案例
  • 案例
  • 演示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档