覆盖主要构造函数的开放值

时间:2019-01-03 20:15:54

标签: kotlin

想象一下我有这样的课程:

open class CSRequest<Data : Any>(open val onSend: () -> CSResponse<Data>) {
// some other code
}

我希望有时能够覆盖它,所以我可以写一些类似的东西:

class SpecialRequest(items: List<String>) : CSRequest<CSServerData>() {
    override val onSend: () -> CSResponse<CSServerData> = {
        // Do send work
    }
}

但是我不能。这是我的API。我在问,如果我能以某种方式设计类CSRequest,那么onSend的值将通过扩展类CSRequest被覆盖,但同时可以作为构造函数参数传递。

1 个答案:

答案 0 :(得分:0)

超类构造函数需要一个() -> CSResponse<Data>类型的参数。因此,子类在调用超级构造函数时必须传递这样的值,并且不需要重写任何内容。

由于您尚未发布代码段中使用的类的代码,因此我将举一个简单的示例:

class CSResponse<D>(val body: D)
class CSServerData

open class CSRequest<Data : Any>(open val onSend: () -> CSResponse<Data>) {
    // some other code
}

class SpecialRequest(items: List<String>) : CSRequest<CSServerData>({ CSResponse(CSServerData()) })