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

时间:2017-12-30 10:08:06

标签: java kotlin

我最近盯着Kotlin并且有Java经验。在Java中,我们可以声明具有与父级相同名称的字段。当我在Kotlin中执行相同操作时,会出现错误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;
}

3 个答案:

答案 0 :(得分:1)

改变它,

open class ClassParent(name: String) {

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

}

您可以使用init block check details

答案 1 :(得分:1)

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

open class User(protected open var name: String)

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

您只需要考虑,这主要是改变了属性的实现。您将无法单独访问User.nameTwitterUser.name。它是一样的。

答案 2 :(得分:1)

如果您的超类已经具有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)