当前位置: 首页 > 知识库问答 >
问题:

子类初始化后抽象类能工作吗?

狄兴邦
2023-03-14
abstract class ExampleClass {
    abstract val foo: Int
    init {
        println("Here is foo times 2!: ${foo * 2}")
    }
}

class ChildClass : ExampleClass() {
    override val foo = 5
}
abstract class ExampleClass {
    abstract val foo: Int
    fun bar() {
        println("Here is foo times 2!: ${foo * 2}")
    }
}

class ChildClass : ExampleClass() {
    override val foo = 5
    init {
       bar()
    }
}

并且让我的所有子类在init时调用bar()?这样做感觉不对,因为用foo完成的工作只会发生一次。

共有1个答案

查宜民
2023-03-14

我相信答案是否定的,这是不可能的。

用于类初始化的Kotlin语言文档是这样说的:

[B]在基类构造函数执行时,在派生类中声明或重写的属性尚未初始化。如果在基类初始化逻辑中使用这些属性中的任何一个(直接或间接地,通过另一个重写的开放成员实现),都可能导致不正确的行为或运行时失败。因此,在设计基类时,应避免在构造函数、属性初始化器和init块中使用打开成员。

 类似资料:
  • 问题内容: SuperClass object = new SubClass(); 为什么使用超类实例化上面的子类对象?因为我学会实例化对象的唯一方法是: 我正在学习Java。 问题答案: 您可能有一个仅接受实例的方法。由于 是 ,您可以使用的实例并将其视为。 使用接口时,会使用相同的行为: 这就是多态的美。它允许您更改类内部的实现,而无需破坏其余代码。

  • 我找不到任何关于这个具体案例的具体SO帖子,所以我想问一下我认为是/否的问题。 以下是JLS§12.4.2(Java SE 8),清单6-7: 我的问题是:这是否意味着子类的final static变量在超类的静态初始化之前初始化(假设final static作为其声明的一部分初始化)?

  • 问题内容: 我正在尝试创建UIBezierPath的子类,以添加一些对我有用的属性。 编辑:我需要这个,因为在我的代码中我写 并导致编译错误: “必须调用超类’UIBezierPath’的指定初始化程序” 我试图在子类中添加该初始化器,但似乎不起作用。 你能帮我吗? 问题答案: 注意 :此问题已在iOS 9中得以解决,在该版本中,API已被重写为存在,其他所有(方便初始化程序)也是如此。 问题 简

  • 我有一个子类,它声明了我的抽象超类中的所有方法,但它仍然给我一个错误,说明我的类不是抽象的。我不知道为什么会抛出这个错误。 我得到的具体错误是 PhoneBookEntry.java: 1:错误:PhoneBookEntry不是抽象的,并且不会覆盖可比中的抽象方法compareTo(Object) 我的问题代码: 还有我的子类:

  • 问题内容: 我想知道下面的代码是否有意义,因为编译器会警告“空白的最终字段对象可能尚未初始化”。有更好的方法吗? 问题答案: 我将字段定为final,并强制构造函数将值向上传递:

  • 我查过了,发现最接近的是这个,除了我没有任何向前的声明。我在基类中只有一个纯虚函数,我在子类中实现它,如下所示: 命令H 命令cpp 数字H 数字cpp 发生文件错误: 一个dd.cpp 添加H