kotlin 子类中父类的扩展方法

f4t66c6m  于 2023-05-18  发布在  Kotlin
关注(0)|答案(2)|浏览(182)

我有个简短的问题是否可以用额外的参数扩展子类的方法?原始方法在父类中定义。
这个想法是声明一个基本功能,每个文件都必须检查。然后,子类应该基于典型的参数(如csv(columnCount,header,...))扩展父类的额外功能。
例如:

abstract class DataValidator {
    fun checkIfFileDoesExist(fileName: String, fileExtension: String): Boolean {
        val file = Path(fileName)

        return when {
            file.notExists() -> false
            file.extension != fileExtension -> false
            else -> true
        }
    }
 }

class CsvValidator: DataValidator() {
    override fun checkIfCsvFileDoesExist(
        fileName: String,
        fileExtension: String,
        additionallyParameter: String
    ): Boolean {
        var result = super.checkIfFileDoesExist(fileName, fileExtension)
        // processing with additionallyParameter
        return false
    }
}

ide抛出一个错误,但是这样的问题如何解决呢?谢谢你的帮助。

axr492tv

axr492tv1#

通常,在Java或Kotlin中,不可能使用不同的签名来 * 覆盖 * 一个方法。您可以 * 重载 * 方法,即有多个签名,并分别覆盖它们,但我不认为这是你正在寻找的。
如果不理解additionalParameter的含义,很难提出一种建模方法。此参数是否仅与CSV文件相关?
一种可能的方法是将参数移动到构造函数中,并在基类中创建一个抽象方法,因为additionalParameter对所有可能的实现都是通用的。

abstract class DataValidator(
    val fileName: String,
    val fileExtension: String
) {
    fun checkIfFileDoesExist(): Boolean {
        val file = Path(fileName)

        return when {
            file.notExists() -> false
            file.extension != fileExtension -> false
            else -> true
        }
    }

    abstract fun validateFile(additionalParameter: String): Boolean
}

class CsvValidator(fileName: String, fileExtension: String) : DataValidator(fileName, fileExtension) {
    override fun validateFile(
        additionalParameter: String
    ): Boolean {
        if (checkIfFileDoesExist()) {
            // processing with additionalParameter
        }
        return false
    }
}

使用方法:

val validator = CsvValidator("myFile", "csv")
validator.validateFile("additionalParameter")
bxgwgixi

bxgwgixi2#

我想到了这个方法。

abstract class DataValidator {
    fun checkIfFileDoesExist(fileName: String, fileExtension: String): Boolean {
        val file = Path(fileName)

        return when {
            file.notExists() -> false
            file.extension != fileExtension -> false
            else -> true
        }
    }
 }

class CsvValidator: DataValidator() {
    fun checkIfCsvFileDoesExist(
        fileName: String,
        fileExtension: String,
        additionallyParameter: String
    ): Boolean {
        var result = super.checkIfFileDoesExist(fileName, fileExtension)
        // processing with additionallyParameter
        return false
    }
}

相关问题