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(分母绝对值