Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
继承期间的Kotlin主构造函数和辅助构造函数_Kotlin_Primary Constructor - Fatal编程技术网

继承期间的Kotlin主构造函数和辅助构造函数

继承期间的Kotlin主构造函数和辅助构造函数,kotlin,primary-constructor,Kotlin,Primary Constructor,我正在学习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

我正在学习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()
}
开放类动物(){
变量名称:String=“noname”;
构造函数(名称:String):this(){
this.name=name
}
开开心吃{
println(“动物正在吃的$name”)
}
}
狗类:动物{
构造函数():super()
构造函数(名称:字符串):超级(名称)
吃得开心{
println(“狗正在吃的$name”)
}
}
趣味主线(args:Array){
变量a1=动物(“食物”)
变量a2=动物()
变量d1=狗(“棒”)
var d2=Dog()
吃
吃
d1.吃
d2.吃
}
是否可以修改程序,使子类调用父类的主构造函数而不使用另一个辅助构造函数
我在这里试图实现的是,在使用主构造函数和辅助构造函数创建对象时,不要强制用户传递参数


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

在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”设置为null,并在构造函数中将其设置为null。如果您不想让它为null,但仍然需要两个不同的构造函数(带名称和不带名称),那么您必须分别实现这两个构造函数。分别实现这两个构造函数将意味着与我在问题中所做的相同的事情?这是正确的,尽管您在问题中设置了名称的默认值。现在,你写的代码和我写的代码做同样的事情。。。因此,我认为没有其他方法可以在不使用默认值或您提到的空值或两个不同的二级构造函数的情况下获得相同的输出。是吗?因为我实际上期望的是这样的东西:
class Dog():Animal()