我最近盯着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;
}
答案 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.name
或TwitterUser.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)