在Parent类中声明与Child类相同的属性

我最近已经注意到Kotlin,并有Java的经验。 在Java中,我们可以使用与父类相同的名称声明该字段。 当我在Kotlin做同样的事情时,它给出name hides member of Super type User错误name hides member of Super type User 。 我在这里错过了什么?

科特林

 open class User(protected var name: String) class TwitterUser(var name: String) : User(name) 

Java的相同概念

 public class A { protected String name; } public class B extends A { String name; } 

问题是,你隐藏了原始属性的实现。 但无论如何,有一种可能:

 open class User(protected open var name: String) class TwitterUser(override var name: String) : User(name) 

你只需要考虑,这主要是改变财产的执行情况。 您将无法分别访问User.nameTwitterUser.name 。 这是一样的。

改变一下,

 open class ClassParent(name: String) { } 

 class ClassChild(name: String) : ClassParent(name) { } 

你可以使用init块, 查看细节

如果你的父类已经有一个name属性,那么任何子类都会自动拥有它。 那么为什么你会再次在那个孩子身上定义呢? 最好把它定义为构造函数的一个参数,而不要把它作为另一个属性:

 open class User(protected var name: String) //name is not a val/val! simply passed to the constructor as an argument class TwitterUser(name: String) : User(name) 

否则,如果您确实需要重写该属性,请在父项中打开并在子项中重写:

 open class User(protected open var name: String) class TwitterUser(override var name: String) : User(name)