Как лучше организовать иерархию классов
У меня есть абстрактный ImageFilter такого содержания:
abstract class ImageFilter {
internal abstract val size: Int
fun applyForImage(image: BmpImage) {
//тут используется size для вычисления границ
//где-то тут вызывается applyForOnePixel(data)
//...
}
abstract fun applyForOnePixel(data: Array<Array<RGBColor>>): RGBColor
}
Реализовать класс наследник нет проблемы, однако, чтобы вызвать applyForImage нужно обязательно создавать instance, например, таким образом
GrayscaleFilter().applyForImage(img)
Однако хочется делать это так
GrayscaleFilter.applyForImage(img)
Я понимаю, что нужно использовать companion object, но как заставить наследников реализовывать applyForOnePixel и указывать size, если внутри compaion object'a нельзя использовать abstract?
Ответы (1 шт):
Автор решения: IR42
→ Ссылка
abstract class Foo {
abstract val s: String
fun print(i: Int) {
println("$s$i")
}
}
class Bar {
companion object : Foo() {
override val s = "Bar"
}
}
class Baz {
companion object : Foo() {
override val s = "Baz"
}
}
fun main() {
Bar.print(1) // Bar1
Baz.print(2) // Baz2
}
Можно упростить и сделать сами классы синглтонами и наследниками абстрактного класса
object Bar : Foo() {
override val s = "Bar"
}
object Baz : Foo() {
override val s = "Baz"
}