考虑以下问题:
我们有一个具有抽象方法的“Base”类。现在,我们希望强制执行每个此方法的覆盖将执行某些参数检查或其他繁琐工作。我们希望此参数检查在所有覆盖中都是相同的。一种解决方案是将此行为包装在调用抽象方法的非抽象方法中:
我希望将
我们有一个具有抽象方法的“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<String>)
{
val d = Derived1()
println(d.computeSomething(23))
}
我希望将
Base :: execute
设为私有,以便不会在未检查其参数的情况下意外调用Base
的任何子类。但是,这是不可能的:Kotlin的错误:(9,5)Kotlin:修饰符“ private”与“ abstract”不兼容
protected
比Java的protected
更好,因为它只使函数对子类可访问,但理想情况是private
。那么,有没有正确的方法来实现此模式?另外,出于好奇,private
和abstract
的不兼容性是语言设计的故意选择吗?