考虑一下问题:
我们有一个带抽象方法的Base类.现在,我们希望强制执行此方法的每个覆盖都将执行一些参数检查或其他一些苦差事.我们希望这个参数检查在所有覆盖中都是相同的.一种解决方案是将此行为包装在一个非抽象方法中,该方法调用一个抽象方法:
abstract class Base
{
fun computeSomething(argument: Int): Int
{
require(argument > 0) // Some intricate checking
return execute(argument)
}
// Pure functionality, assuming correct arguments
// Ideally, this would be private.
protected abstract fun execute(validArgument: Int): Int
}
class Derived1: Base()
{
override fun execute(validArgument: Int): Int =
validArgument * validArgument
}
class Derived2: Base()
{
override fun execute(validArgument: Int): Int =
validArgument * validArgument * validArgument
}
fun main(args: Array)
{
val d = Derived1()
println(d.computeSomething(23))
}
我想让Base :: execute private,这样Base的子类就不会在不检查其参数的情况下偶然调用它.不幸的是,这是不可能的:
Error:(9, 5) Kotlin: Modifier ‘private’ is incompatible with
‘abstract’
Kotlin的受保护比Java受保护更好,因为它使函数只能访问子类,但理想情况仍然是私有的.
那么有没有一种正确的方法来实现这种模式?另外,出于好奇,私人和抽象的不兼容是故意选择语言设计吗?