2017-05-29 127 views
5

最近开始使用科特林构造在科特林

根据科特林文档,可以有一个主构造和一个或多个次级构造函数。

我不明白为什么我看到这个错误 enter image description here

由于类test不具备主要的构造。

这工作得很好:

open class test { 
} 

class test2 : test() { 
} 

这里是我所面临的另一个困难,当我定义了一个次级构造的IDE显示了另一个错误说

超类型的初始化是不可能没有主构造 enter image description here

但在前面的工作示例中,我没有初始化它,但它工作正常。我错了什么?

+0

这是覆盖了科特林文档中的构造? http://kotlinlang.org/docs/reference/classes.html#constructors –

回答

5

由于即使未在基类中定义主构造函数或辅助构造函数,仍然会为该类生成默认的无参数构造函数,因此会出现此错误。派生类的构造函数应该总是调用一些超级构造函数,而在你的情况下只有默认构造函数(这是可以调用的构造函数,如test()来创建类的对象)。编译器和IDE迫使你这样做。


超级构造函数规则在一定程度上使问题复杂化。

如果您在派生类中定义了一个没有定义主构造函数的辅助构造函数(类声明附近没有括号),那么辅助构造函数本身应该调用超级构造函数,并且不应该在该类中指定超级构造函数参数声明:

class test2 : test { // no arguments for `test` here 
    constructor(a: Int) : super() { /* ... */ } 
}

另一种方法是定义主构造函数和从二级一个叫它:

class test2() : test() { 
    constructor(a: Int) : this() { /* ... */ } 
} 
+0

谢谢,@hotkey,这清除了我面临的第二个问题,我仍然不明白为什么IDE显示**这种类型有一个构造函数**时我在'test2'中继承'test',显然'test'没有构造函数,对吗? –

+1

@ShafayatAlam,嗯,它实际上是这样的:如果你在一个类中定义了主要和次要构造函数,仍然会生成一个默认的无参数构造函数,并且由于超级构造函数应该总是在派生类中被调用,你打电话给默认的一个。 – hotkey

+0

@ShafayatAlam,更新了答案并解释了这一点。 – hotkey