首页 > 解决方案 > Kotlin 中的运行时多态性

问题描述

在这种情况下,有什么优雅的方法可以应用多态性吗?解析器在运行时提供以下类:

class io.swagger.v3.oas.models.media.Schema //is parent of the rest :

class io.swagger.v3.oas.models.media.ComposedSchema
class io.swagger.v3.oas.models.media.ArraySchema
class io.swagger.v3.oas.models.media.StringSchema
class io.swagger.v3.oas.models.media.ObjectSchema

我希望每个类都具有相同的名称和简单、简短的方法,该方法将在运行时强制转换和调用必要的函数。这实际上正在发生,但我希望有更简短的解决方案,而无需制作这种重复:

fun main() {

    val parser = OpenAPIV3Parser()
    val asList = listOf(pathYaml3, pathYml2)
    val map = asList.map(parser::read)
            .flatMap { it.components.schemas.values }
            .forEach(::parseRawSchema)
}


fun parseRawSchema(schema: Schema<Any>) {

    if (schema is ComposedSchema) {
        parseSchema(schema)
    }
    if (schema is StringSchema) {
        parseSchema(schema)
    }
...
}

fun parseSchema(schema: ComposedSchema) {
    println("Compose-schema")
}

fun parseSchema(schema: StringSchema) {
    println("Sting-schema")
}

...

标签: kotlinpolymorphismoverriding

解决方案


尝试使用扩展名。例如:

fun ComposedSchema.parseSchema() {
    println("Compose-schema")
}

fun StringSchema.parseSchema() {
    println("Sting-schema")
}

然后:

fun parseRawSchema(schema: Schema<Any>) {
    schema.parseSchema()
}


推荐阅读