预期主要构造函数调用

时间:2020-08-29 05:12:34

标签: kotlin

这是Kotlin中继承的示例。

open class Person() {
    var _name : String = ""
    var _age : Int = 0

    constructor(name: String, age : Int)  : this(){
        _name = name
        _age = age
    }
}

class Student() : Person() {
    var _university : String = ""

    constructor (name : String, age: Int, university: String) : super(name, age){
        _university = university
    } 
}

fun main() {
   var person = Person("a", 10)
   var student = Student("b", 18, "MIT")
   println("${person._name} : ${person._age}")
   println("${student._university}")
}

在这种情况下,如何解决错误“期望进行主要构造函数调用”?

1 个答案:

答案 0 :(得分:3)

如果类具有主构造函数,则必须将辅助构造函数委派给主构造函数。 Person类的情况就是这样,而事实并非如此。

首先,您应该按照Kotlin的习惯用法(使用可选参数而不是构造函数重载)删除// This one's completely optional to do, skip if you don't want to follow idioms open class Person( var name : String = "" var age : Int = 0 ) 类的样板。

class Student: Person {
    var university: String = ""
    
    constructor() : super()

    constructor (name: String, age: Int, university: String) : super(name, age) {
        this.university = university
    }
}

然后,Student类应具有两个单独的构造函数,因为如果您使用主构造函数,则其他构造函数必须委托给它:

#[macro_export]
macro_rules! btreemap {
    () => {{
        ::std::collections::BTreeMap::new()
    }};
    ($( $key: expr => $val: expr ),*) => {{
        let mut map = ::std::collections::BTreeMap::new();
        $( map.insert($key, $val); )*
        map
    }};
}