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

当基类已经导致Kotlin中的初始化时,如何防止子类私有var的初始化?

暴阳州
2023-03-14
abstract class Parent {
    constructor() {
        sayName()
    }

    abstract fun sayName()
}

class Child : Parent() {
    private var name: String = "Melina"
    
    override fun sayName() {
        if (name == null) name = "John"
        println(name)
    }
}

fun main() {
    println("Hello, world!!!")
    var child = Child()
    child.sayName()
}
if (name == null) name = "John"

我们如何防止子类重写值,使其保持为“John”?

我知道我可以把“Melina”放在这两个地方,但我想知道是否可以不重复这个值。

共有1个答案

龚凌
2023-03-14

最好不要调用构造函数中的操作。

构造函数是初始化字段的好地方。如果父类的每个子类都应该有名称,则可以将其声明为字段,并在子类中设置具体值。因此,在构造对象之后调用sayname()方法:

abstract class Parent {
    abstract val name: String
    
    abstract fun sayName()
}

class Child : Parent() {
    override val name: String = "Melina"
    
    override fun sayName() {
        println(name)
    }
}

如果您使用某种框架创建对象,您可以用命令注释您的方法,以便在创建后调用此方法。例如,如果使用Spring框架,请在方法sayname()上放置@postconstruct

 类似资料:
  • 我有一个类,我想用在另一个视图中设置的绑定变量初始化它。 查看- 需要使用 @Binding var $numberofNumbers 初始化的类 - init语句显然给出了一个错误,即self未初始化,而实例var用于初始化,这是不允许的。 我该如何避免这种情况?需要使用用户在第一个视图中输入的编号初始化该类。我在这里写了大概的代码,所以请忽略任何打字错误。

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

  • 问题内容: 在Python中,请考虑以下代码: 如何在子类中初始化?我正在关注Python教程,但没有涵盖。当我在Google上搜索时,发现了不止一种方法。处理此问题的标准方法是什么? 问题答案: Python(直到第3版)支持“旧式”和新式类。新样式类派生自您使用的类,并通过调用它们的基类,例如 因为python了解旧样式和新样式的类,所以有不同的方法可以调用基本方法,这就是为什么您找到了多种方

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

  • 我正在尝试使用 我收到了这些错误信息,比如: 错误:应该在运行时初始化的类在映像构建过程中被初始化了:org.apache.log4j。在构建时(从命令行)请求初始化该类的级别。org.apache.log4j。在没有本机映像初始化仪表的情况下初始化了级别,并且无法跟踪堆栈跟踪。尝试避免初始化导致org.apache.log4j初始化的类。级别org.slf4j.log4j12。Log4jLogg

  • 类初始化规则规定:如果由于访问静态字段而触发类初始化,则只初始化声明了静态字段的类,即使静态字段被子类、子接口的类型或接口的实现类引用,也不会触发超类或子类的初始化。然后在下面的代码中,只应打印“初始化超类”。 } 当我运行这个时,输出: