【问题标题】:In Kotlin, Why Abstract class cannot be delegated using "by" keyword just like interface在 Kotlin 中,为什么不能像接口一样使用“by”关键字委托抽象类
【发布时间】:2021-05-10 18:37:28
【问题描述】:
interface IA {
    fun callMe()
}

abstract class AbstractA {
    abstract fun callMe()
}

// Allowed
class ImplementationA(a: IA): IA by a

//Why this is Not Allowed ?
class ImplementationA(a: AbstractA): AbstractA() by a

我找不到任何令人满意的理由说明为什么不能使用“by”关键字委托抽象类。

注意: 说we need to call constructor of Abstract class while extending it,这不是一个令人满意的问题技术答案。

【问题讨论】:

  • 1.不,接受答案中的那些陈述不够令人满意。在提供链接之前,您自己是否认为该答案令人满意?如果是,您能解释委派抽象类的问题吗? ---- 2. 他们甚至没有在那个答案中谈论抽象类。
  • 我实际上同意@Cililing 并发现答案令人满意。你觉得哪一部分不适用?它概述了为什么只能使用接口并且作为抽象类不是接口,那么它完美地回答了您的问题?
  • 是的,我检查了答案,您的问题完全可以通过该答案得到解决。因此,只需回答您的问题 - 您不能将抽象类用作委托,因为它不是接口。然而,在链接的问题中,有一个解释为什么委派仅限于接口。

标签: kotlin kotlin-delegate


【解决方案1】:

这是不可能的,因为委托仅限于接口。

比方说,其中一个主要原因是违反合同——如果一个类被委托,那么“默认”方法,如toString、hashCode、equals——它们是否应该被委托?

This question (Why only interfaces can be delegated to in Kotlin) 解释了为什么会这样以及取消这个限制会产生什么后果。

【讨论】:

  • 几天后重温答案,现在说得通了。
猜你喜欢
  • 2018-03-05
  • 1970-01-01
  • 2019-08-16
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 2020-08-22
相关资源
最近更新 更多