在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.name
或TwitterUser.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)