Kotlin,铸造功能接收器

时间:2017-04-09 07:09:49

标签: kotlin

我有几个object,例如object Buffer,提供确定的功能,我想致电

binding(bufferName[Buffer.VERTEX] to GL_ARRAY_BUFFER) {
    ... // calling Buffer functions
}

由于object Buffer

,我可以在内部使用GL_ARRAY_BUFFER的功能

binding目前是如此定义的

inline fun <T, R> binding(pair: Pair<Int, Int>, block: T.() -> R)

所以我的问题是,是否可以根据pair.second将T“转换”为特定对象,以便我可以调用该对象提供的那些函数?

1 个答案:

答案 0 :(得分:1)

据我所知,根据Int值pair.second选择T不是可能的。但是,密封类是实现这种“每种值的不同方法的枚举”的一种好方法:

sealed class BufferType(val type: Int) {
    class ArrayBuffer() : BufferType(GL_ARRAY_BUFFER)
    class AtomicCounterBuffer() : BufferType(GL_ATOMIC_COUNTER_BUFFER)
    /* other buffer types... */
}

inline fun <Buffer: BufferType, R> binding(pair: Pair<Int,Buffer>, block : (Buffer) -> R) {
    glBindBuffer(pair.second.type, pair.first)
    block()
    /* ... */
}

然后,您可以在顶级BufferType类(对于全局可用方法)或每个单独的缓冲区类型上公开所有可用的缓冲区方法。