2016-03-01 107 views
3

我有一个基类,我正在扩展,但想膨胀一个正常的构造函数为Java的视图。Kotlin初始化一个对象

class TextView(context: Context?) : ViewAbstractClass(context) 

我不知道如何在Kotlin中做到这一点。 Kotlin有什么构造可以让你对对象进行复杂的初始化?

回答

2

有几种方法可以完成,但这是我一直在我的应用程序中做的。

class TextView : ViewAbstractClass { 

    constructor(context: Context) : super(context) 
    constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) 
    constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) { 
     // custom init code for this constructor. 
    } 
    constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) 

    init { 
     // Common init code 
    } 

} 

注意,你实际上并不在类签名使用(),而是明确提供的所有构造函数。

您可以了解更多关于此次级构造函数: https://kotlinlang.org/docs/reference/classes.html

+0

这是一个非常特殊的一段代码科特林。不知道它是如何回答Q – voddan

+0

有没有办法在初始化的不同阶段调用'super'?像'init'机制一样......我们可以在初始化期间的某个阶段调用其中一个其他构造函数吗?或者在default构造函数完成后调用init? – fergdev

+1

我刚刚意识到他实际上在问什么。废话。是的,正如上面所说的'voddan',你正在寻找'init'。 'init'总是在父进程'init'之后调用,并且你不需要调用super(实际上,你不能)。 – bclymer

2

https://kotlinlang.org/docs/reference/classes.html#constructors

class Customer(name: String) { 
    init { 
     logger.info("Customer initialized with value ${name}") 
    } 
} 
+0

'init'代码块如何与'标准'构造函数相关?例子...我们可以在'init'代码块运行后设置名称吗?或者我们可以在'init'代码块的末尾调用'default'构造函数吗? – fergdev

+1

想想默认构造函数体的init块。所以你不会设置名字,你会得到名字通过它。 – CaseyB