Object Kotlin在抽象类的非抽象函数中访问抽象函数

Object Kotlin在抽象类的非抽象函数中访问抽象函数,object,kotlin,inheritance,abstract-class,Object,Kotlin,Inheritance,Abstract Class,我的课程基本上是这样的: abstract class BaseContinuousSingleObjectiveFitnessFunction { // Invoke should compute some function, like f(x) = x^2 + 3x + 5 abstract fun invoke(x: List<Double>): Double // This is supposed to return an object deriv

我的课程基本上是这样的:

abstract class BaseContinuousSingleObjectiveFitnessFunction {

    // Invoke should compute some function, like f(x) = x^2 + 3x + 5
    abstract fun invoke(x: List<Double>): Double

    // This is supposed to return an object deriving this one where 
    // invoke actually returns 1/(1+f(x)), essentially reversing the function.
    fun reverse(): BaseContinuousSingleObjectiveFitnessFunction =
            object: BaseContinuousSingleObjectiveFitnessFunction() {
                override operator fun invoke(x: List<Double>): Double {
                    var denominator = 1.0 + super.invoke(x)
                    if (denominator.absoluteValue < Double.MIN_VALUE * 10)
                        denominator += denominator.sign * Double.MIN_VALUE * 10

                    return 1.0 / denominator
                }
            }
}

抽象类BaseContinuousSingleObjectiveFitnessFunction{
//调用应该计算一些函数,比如f(x)=x^2+3x+5
抽象乐趣调用(x:List):双精度
//这应该返回一个派生这个的对象,其中
//invoke实际上返回1/(1+f(x)),本质上颠倒了函数。
fun reverse():BaseContinuousSingleObjectiveFitnessFunction=
对象:BaseContinuousSingleObjectiveFitnessFunction(){
重写运算符调用(x:列表):双精度{
变量分母=1.0+super.invoke(x)
if(分母绝对值
问题是
invoke
是抽象的,所以编译器抱怨
抽象成员不能直接访问。
这是正确的

然而,派生我的类的任何类显然都将被迫实现
invoke
,因此从概念上讲,在这些类中调用
reverse
,但在这个基类中实现应该没有问题。
reverse
的实现严格来说依赖于
invoke
,但在任何不提供
invoke
的类中都不能调用此实现

最简单的解决方案是在每个类中复制
reverse
的代码,但我不希望有代码复制


因此,我的问题是,做我想做的事情的优雅方式到底是什么:提供一个定义良好的行为(
reverse
),该行为使用尚未定义的行为(
invoke
),但在调用
reverse
时将100%定义该行为?

问题在于
super.invoke(x)
正在尝试调用直接从
BaseContinuousSingleObjectiveFitnessFunction
派生的对象的超级方法。因为没有超级实现,所以会出现错误。您可能希望保留对原始函数的引用:

fun reverse():BaseContinuousSingleObjectiveFitnessFunction{
val originalFunction=此
返回对象:BaseContinuousSingleObjectiveFitnessFunction(){
重写运算符调用(x:列表):双精度{
变量分母=1.0+原始函数调用(x)
if(分母绝对值
问题在于
super.invoke(x)
试图调用直接从
BaseContinuousSingleObjectiveFitnessFunction
派生的对象的super方法。因为没有超级实现,所以会出现错误。您可能希望保留对原始函数的引用:

fun reverse():BaseContinuousSingleObjectiveFitnessFunction{
val originalFunction=此
返回对象:BaseContinuousSingleObjectiveFitnessFunction(){
重写运算符调用(x:列表):双精度{
变量分母=1.0+原始函数调用(x)
if(分母绝对值