Я хотел бы вызвать один класс с параметром enum
и позволить Types
и collections<Type>
членов класса зависеть от этого параметра enum
. Я готов принять ответ, что в этом и заключается цель абстрактных классов и интерфейсов, и нет другого пути продвинуться в этом направлении. Я просто хочу быть уверен, что не пропустил хитрый трюк.
Например, я хотел представить коллекцию кадров фильма как массивы байтов или массивы шорт, где обработка изображения зависит от глубины цвета канала и битовой глубины. Я считаю, что стандартной практикой было бы создание абстрактного класса или интерфейса, а затем наследование от них для каждого из enum
членов. Это стандартное решение требует нескольких файлов и разделяет особенности обработки на эти отдельные файлы.
Следующий класс иллюстрирует попытку без интерфейса или абстрактного класса. Проблема в том, что все, что входит или выходит из этого класса, имеет тип Any
и должно быть явно приведено. Это не стартер. Я недостаточно знаком с Generics, чтобы понять, дает ли это решение. В JVM есть Type
стирание, так что я думаю, что это тоже тупик. Мой пример - Kotlin, но я думаю, что он следует и для других объектно-ориентированных языков.
class MovieFrames(val nRow:Int,val nCol:Int, val type: ElementType) {
val list = mutableListOf<Any>()
val frameSize = nRow * nCol
fun nframe() = list.size
constructor(nRow: Int, nCol: Int, values: List<Any>, type: ElementType = ElementType.Gray8) :
this(nRow, nCol, type) {
when (type) {
ElementType.RGB8 -> values.forEach { list.add(it as ByteArray) }
ElementType.Gray8 -> values.forEach { list.add(it as ByteArray) }
ElementType.Gray16 -> values.forEach { list.add(it as ShortArray) }
}
}
fun saveToFile(filename: String) {
when (type) {
ElementType.RGB8 -> {/*put Red, Green, Blue bytes to disk*/ }
ElementType.Gray8 -> {/*put Bytes to disk*/ }
ElementType.Gray16 -> {/*put Bytes to disk with specific byte ordering*/ }
}
}
fun getFrame(f:Int) : Any {
return list[f]
}
}
enum class ElementType(bitDepth: Int, channels: Int) {
RGB8(8, 3),
Gray8(8, 1),
Gray16(16, 1);
}