下面是一个例子:
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
,所以我添加了下面这行
if (name == null) name = "John"
以便在这种情况下定义值。但是,子类仍然会用值"Melina“覆盖值"John”。
我们如何防止子类覆盖该值,从而使其保持为"John"?
我知道我可以把"Melina“放在这两个地方,但我想知道是否有可能不重复这个值。
发布于 2021-04-25 05:37:45
最好不要在构造函数中调用操作。
构造函数是初始化字段的好地方。如果父类的每个子类都应该有name,则可以将其声明为field,并在子类中设置具体的值。所以在构造object之后调用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 Framework,则将@PostConstruct
放在方法sayName()
上。
https://stackoverflow.com/questions/67246237
复制相似问题