Kotlin:抽象超类可以有一个抽象的构造函数吗?

时间:2017-09-07 04:16:22

标签: kotlin

我刚刚写了这篇文章,就目前而言这很好:

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
    )
}

但是如果可能的话,我想坚持所有扩展BatchJobPayload的类实现带签名的辅助构造函数 constructor(payload: JsonElement): BatchJobPayload,用于反序列化。

BookingConfirmationMessagePayload有这样的构造函数但只是因为我把它放在那里,而不是因为BatchJobPayload坚持它...

2 个答案:

答案 0 :(得分:1)

您不能强制执行超级构造函数,但是您可以让工厂使用生成的spawn方法返回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)
}

答案 1 :(得分:1)

我提出了一个可行的选项,如下所示:

interface BatchJobPayload {
    fun toJson(): JsonObject
}

interface BatchJobPayloadDeserialize {
    operator fun invoke(payload: JsonElement): BatchJobPayload
}

class BookingConfirmationMessagePayload(val bookingId: Int) : BatchJobPayload {
    override fun toJson() = jsonObject(
        "bookingId" to bookingId
    )
}

class BookingConfirmationMessagePayloadDeserialize : BatchJobPayloadDeserialize {
    override operator fun invoke(payload: JsonElement) =
        BookingConfirmationMessagePayload(payload["bookingId"].int)
}

现在您可以从BookingConfirmationMessagePayload反序列化JsonElement对象,如下所示:

BookingConfirmationMessagePayloadDeserialize()(payload)

invoke运算符只是一些语法糖,可能与钝点接近......)

实际上我还是比较粗略的原始代码---未来需要子类BatchJobPayload的开发人员最初可能会忽略定义一个JsonElement的构造函数,但他们肯定会意识到一旦他们只有一串JSON,他们需要把它们变成他们新类的一个实例...