这个问题在Stack Overflow上已经有了答案,但由于我是Kotlin的新手,我不理解那个答案。如果有人能以简单的语言告诉我下面的代码有什么问题,以及如何修复它,那将非常有帮助。在Country类的'name'属性下,我收到了来自IntelliJ IDEA的警告,说我正在尝试在构造函数中访问非final属性名。这有什么问题吗?
open class Country (n : String? = null)
{
open var name : String? = n
init {
if (n==null)
{
this.name = "Unknown Country"
}
else
{
this.name = n
}
}
fun printCountryName()
{
println("Country Name : ${this.name}")
}
}
class India constructor(n: String? = null, p: Int, g: Double ): Country(n)
{
override var name : String? = "India"
}
It's okay if you don't understand another similar question - just clearly point out what you don't understand.
- Someone_who_likes_SEvar
设为open
吗?这似乎没有必要允许子类覆盖该属性。也许你是想让子类赋值给现有的属性?如果不是open
,那么你就不会遇到这个问题。 - Silvio Mayoloinit
块,直接使用val name = n ?: "Unknown Country"
呢?然后由子类将适当的名称传递给构造函数。例如,您的朋友可以这样做class India : Country("India")
。当然,为每个国家创建一个子类并不是可行的方法(它无法很好地扩展)。如果您需要一个“印度国家”,那么您应该只需执行foo = Country("India")
。 - Slaw