如何更好地组织类的层级

How to better organize the hierarchy of classes

我有一个摘要class图像过滤器:

abstract class ImageFilter {
    internal abstract val size: Int
    fun applyForImage(image: BmpImage) {
        //here size is used to calculate the boundaries
        //somewhere here applyForOnePixel(data) is called
        //...
    }

    abstract fun applyForOnePixel(data: Array<Array<RGBColor>>): RGBColor
}

子实现没有问题class,但是为了调用applyForImage,需要创建一个实例,例如这样

GrayscaleFilter().applyForImage(img)

但是,我想这样做

GrayscaleFilter.applyForImage(img)

我知道我必须使用伴随对象,但是如果不能在伴随对象中使用抽象,我如何让子 classes 实现 applyForOnePixel 并指定大小?

如果您的 GrayscaleFilter 不应以任何方式修改,您可以将其定义为 object 而不是 class

object GrayscaleFilter: ImageFilter() {
    override val size: Int = TODO("Not yet implemented")
    
    override fun applyForOnePixel(data: Array<Array<RGBColor>>): RGBColor {
        TODO("Not yet implemented")
    }
}

这种方式在运行时可以使用单个实例,可以根据需要访问,即:

GrayscaleFilter.applyForImage(img)

但是请注意,这有影响。你基本上是在处理一个单身人士。因此,如果您可以以任何方式修改实例,例如通过具有可访问的 var 字段,这些更改是全局的!


在侧节点上,也许您想轮换调用顺序,以便于读取调用,例如:

fun BmpImage.applyFilter(filter: ImageFilter) = filter.applyForImage(this)

fun main() {
    val image: BmpImage = TODO("Not yet implemented")

    image.applyFilter(GrayscaleFilter)
}