如何更好地组织类的层级
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)
}
我有一个摘要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)
}