【发布时间】:2013-05-05 13:00:03
【问题描述】:
我正在编写一个基于 commons-io 的 Groovy 脚本,它监视某个源目录并将其文件与某个目标目录同步。
@Grab(group='commons-io', module='commons-io', version='2.4')
import org.apache.commons.io.monitor.*
import org.apache.commons.io.FileUtils
class BaseSynchronizedFileListener extends FileAlterationListenerAdaptor {
def srcDir
def destDir
/* Given a source file, returns the destination file */
File destination(File file) {
new File(destDir, file.getAbsolutePath() - srcDir.getAbsolutePath())
}
}
class CopyOnWriteListener extends BaseSynchronizedFileListener {
@Override
void onFileChange(File file) {
FileUtils.copyFile(file, destination(file))
}
@Override
void onFileCreate(File file) {
FileUtils.copyFile(file, destination(file))
}
}
class DeleteOnDeleteListener extends BaseSynchronizedFileListener {
@Override
void onFileDelete(File file) {
FileUtils.deleteQuietly(destination(file))
}
}
除了直接的文件拷贝,我想支持Less->CSS编译,其中源目录的.less文件和目标目录的.css文件同步。
@Grab(group='org.lesscss', module='lesscss', version='1.3.3')
import org.lesscss.LessCompiler
class CompileLessOnWriteListener extends BaseSynchronizedFileListener {
def compiler = new LessCompiler()
@Override
File destination(File file) {
File dest = super.destination(file)
new File(dest.parentFile, dest.name - '.less' + '.css')
}
void compile(File less) {
compiler.compile(less, destination(less))
}
@Override
void onFileChange(File less) {
compile(less)
}
@Override
void onFileCreate(File less) {
compile(less)
}
}
我遇到的问题是当我尝试创建类DeleteCssOnDeleteLessListener 来处理.less 文件被删除时的情况(这反过来又删除了相应的.css 文件)——我需要的代码要做到这一点存在于两个不同的继承树中。
-
CompileLessOnWriteListener包含destination()方法 -
DeleteOnDeleteListener包含onFileDelete()方法删除destination()方法返回的CSS文件
是否有一种“Groovy 方式”可以选择性地将这两个类的方法混合或继承到一个新类中?
还是只需要硬着头皮为CompileLessOnWriteListener 和DeleteCssOnDeleteLessListener 创建一个公共超类?
【问题讨论】:
标签: groovy multiple-inheritance mixins