Kotlin algebra/enums/sealed classes

Algebraic data types

It can be used to identify a closed set of types, and enumeration types are a simple ADT

enum class LicenseStatus {
    UNQUALIFIED, LEARNING, QUALIFIED;
}

class Driver(var status: LicenseStatus) {
    fun checkLicense(): String {
        return when (status) {
            LicenseStatus.UNQUALIFIED -> "没资格"
            LicenseStatus.LEARNING -> "在学"
            LicenseStatus.QUALIFIED -> "有资格"
        }

    }
}

fun main(){
    println(Driver(LicenseStatus.QUALIFIED).checkLicense())
}

Sealed

For more complex ADTs, you can use Kotlin's sealed classes, (sealed classes) to implement more complex definitions. Sealed classes can be used to define an ADT similar to an enumeration class, but you can control a subtype more flexibly .

A sealed class can have several subclasses. There is no need for a comma in between. To achieve a sealed class, these subclasses must be defined in the same file as him

sealed class LicenseStatus2 {
    //每次没有要变化的量 所以用单例可以
    object UnQualified : LicenseStatus2()

    object Learning : LicenseStatus2()

    //驾驶证id会变化。所以使用类合适
    class Qualified(val licenseId: String) : LicenseStatus2()
}

class Driver2(var status: LicenseStatus2) {
    fun checkLicense(): String {
        return when (status) {
            is LicenseStatus2.UnQualified -> "没资格"
            is LicenseStatus2.Learning -> "在学"
            is LicenseStatus2.Qualified -> "有资格,驾驶证编号 ${(this.status as LicenseStatus2.Qualified).licenseId}"
        }

    }
}

fun main() {
    val status = LicenseStatus2.Qualified("1234");
    val driver = Driver2(status)
    println(driver.checkLicense())
}

 

Guess you like

Origin blog.csdn.net/mp624183768/article/details/123896862