【问题标题】:Kotlin primary and secondary constructors during inheritance继承期间的 Kotlin 主要和次要构造函数
【发布时间】:2018-05-11 11:10:23
【问题描述】:

我正在学习 Kotlin,但我有点坚持使用构造函数。我编写了一个程序来帮助我理解这个概念。程序如下:

open class Animal(){
    var name :String = "noname";
    constructor(name:String):this(){
        this.name = name
    }
    open fun eat(){
        println("$name the animal is eating")
    }
}
class Dog: Animal{
    constructor():super()
    constructor(name : String):super(name)
    override fun eat(){
        println("$name the dog is eating")
    }
}
fun main (args:Array<String>){
    var a1 = Animal("foo")
    var a2 = Animal()
    var d1 = Dog("bar")
    var d2 = Dog()
    a1.eat()
    a2.eat()
    d1.eat()
    d2.eat()
}

是否可以修改程序,使子类调用父类的主构造函数而不使用另一个辅助构造函数。
我在这里想要实现的是不强制用户在使用主构造函数和辅助构造函数创建对象时传递参数。

如果我的问题很愚蠢,请原谅我。我是新手。

【问题讨论】:

    标签: kotlin primary-constructor


    【解决方案1】:

    在 Kotlin 中,您可以在构造函数本身中设置默认值:

    open class Animal(var name: String = "noname"){
        open fun eat(){
            println("$name the animal is eating")
        }
    }
    class Dog(name: String = "noname"): Animal(name){
        override fun eat(){
            println("$name the dog is eating")
        }
    }
    

    这样,如果在调用构造函数时没有提供字符串,则分配“noname”。另外,当你创建一个 Dog 对象时,它总是会调用父构造函数。

    【讨论】:

    • 太酷了!谢谢。虽然,如果没有默认值,是否有可能?只是好奇。
    • 如果没有提供名称,您可以使“名称”为空,并在构造函数中将其设置为空。如果您不希望它可以为空但仍需要两个不同的构造函数(有名称和没有名称),那么您必须分别实现这两个构造函数。
    • 分别实现两个构造函数与我在问题中所做的相同吗?
    • 这是正确的,尽管您在问题中设置了 name 的默认值。现在,你编写的代码和我的代码做同样的事情
    • 好的...所以我认为,如果不使用默认值或您提到的空值或两个不同的辅助构造函数,没有其他方法可以获得相同的输出。对吗?因为我真正期待的是某种东西:class Dog(): Animal()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2015-06-16
    • 2022-11-03
    • 2016-03-24
    • 2011-12-27
    相关资源
    最近更新 更多