2016-03-01 125 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