首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当基类已经导致Kotlin中的初始化时,如何防止子类私有var初始化?

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

Stack Overflow用户
提问于 2021-04-25 02:39:06
回答 1查看 48关注 0票数 0

下面是一个例子:

代码语言:javascript
运行
复制
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()
}

直播:https://pl.kotl.in/vIuBzrBON

问题是:一个子类想要覆盖一个抽象方法,并在该方法中使用私有变量。在父类构造函数中,子类private var通常是null,所以我添加了下面这行

代码语言:javascript
运行
复制
if (name == null) name = "John"

以便在这种情况下定义值。但是,子类仍然会用值"Melina“覆盖值"John”。

我们如何防止子类覆盖该值,从而使其保持为"John"?

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

EN

回答 1

Stack Overflow用户

发布于 2021-04-25 05:37:45

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

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

代码语言:javascript
运行
复制
abstract class Parent {
    abstract val name: String
    
    abstract fun sayName()
}

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

如果您使用某些框架来创建对象,则可以使用命令注释您方法,以便在创建后调用此方法。例如,如果您使用Spring Framework,则将@PostConstruct放在方法sayName()上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67246237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档