Kotlin: Can an abstract super class have an abstract constructor?

gto*_*tod 5 kotlin

I have just written this, which is fine as far as it goes:

import com.github.salomonbrys.kotson.get
import com.github.salomonbrys.kotson.int
import com.github.salomonbrys.kotson.jsonObject
import com.google.gson.JsonElement
import com.google.gson.JsonObject

abstract class BatchJobPayload {
    abstract fun toJson(): JsonObject
}

class BookingConfirmationMessagePayload(val bookingId: Int) : BatchJobPayload() {
    constructor(payload: JsonElement) : this(payload["bookingId"].int)

    override fun toJson() = jsonObject(
        "bookingId" to bookingId
    )
}
Run Code Online (Sandbox Code Playgroud)

But I'd like to insist, if possible, that all classes that extend BatchJobPayload implement a secondary constructor with the signature constructor(payload: JsonElement): BatchJobPayload, which is to be used for deserializing.

BookingConfirmationMessagePayload has such a constructor but only because I put it there, not because BatchJobPayload insisted upon it...

jrt*_*ell 1

您无法强制执行超级构造函数,但可以强制使用强制生成方法的工厂,该方法返回 的子类BatchJobPayload,这使您可以确保类是可构造的。

它看起来像这样:

class JsonObject // Included to make compiler happy

abstract class Factory<T> {
    abstract fun make(obj: JsonObject): T
}

abstract class Base {
    abstract fun toJson(): JsonObject
}


class A(val data:JsonObject):Base() {
    override fun toJson(): JsonObject {
        return JsonObject()
    }
}

class AFactory: Factory<A>() {
    override fun make(obj: JsonObject): A {
        return A(obj)
    }

}

fun main(args: Array<String>) {
    val dummyJson = JsonObject()

    var factory = AFactory()
    var instance = factory.make(dummyJson)

    println(instance)
}
Run Code Online (Sandbox Code Playgroud)