![](/img/trans.png)
[英]Kotlin - Issue in converting Kotlin method to java for LayerDrawable
[英]Issue converting Java bean with inheritance to Kotlin
在當前的Java類上,我們有2個Java Bean Clazz1和Clazz2,它們都擴展了超類SuperClazz。 我們還有一個列表,在其中我們可以迭代超類條目(可以是Clazz1或Clazz2):
List<SuperClazz> entries;
現在,我們需要將代碼轉換為Kotlin,但是由於數據類不支持繼承,因此我們不確定要解決此問題的最佳方法,我們是否只是創建帶有變量的標准Kotlin類,擴展超類,並手動制作getter -setters? 或者,有沒有更好的方法呢?
通常,有兩種方法可以消除類繼承的需要:
將Clazz1
和Clazz2
之間通用的片段提取到單獨的類中。 即
data class SharedStuff(val a:Int, val b:String)
data class Class1(val stuff:SharedStuff, val other:String)
data class Class2(val stuff:SharedStuff, val specific:Int)
然后您可以在列表中使用它
class Container {
private var items = listOf<()->SharedStuff>()
fun add(a:Class1) { items += { a.stuff } }
fun add(b:Class2) { items += { b.stuff } }
}
從上面的示例可以很容易地看出,您可以提取一個接口來表示Class1
和Class2
內部的通用接口,如下所示:
interface HasStuff { val stuff:SharedStuff }
data class SharedStuff(val a:Int, val b:String)
data class Class1(override val stuff:SharedStuff, val other:String) : HasStuff
data class Class2(override val stuff:SharedStuff, val specific:Int) : HasStuff
class Container {
private var items = listOf<HasStuff>()
fun add(a:HasStuff) { items += a }
}
請注意,我們不一定需要將SharedStuff
作為類。 您還可以在共享界面上擁有更多成員,並且仍然可以通過Kotlin的委派來簡化工作。 (不過,通常最好使用“小”接口 )
我們決定這樣做:
interface HasStuff { val sharedDt:Int }
data class Class1(override val sharedDt:Int, val other:String) : HasStuff
data class Class2(override val sharedDt:Int, val specific:Int) : HasStuff
class Container {
private var items = listOf<HasStuff>()
fun add(a:HasStuff) { items += a }
}
我們是否只是使用變量創建了標准的Kotlin類,擴展了超類並手工制作了吸氣劑?
是的,雖然不是帶有變量,但是帶有屬性 。 如果您的SuperClazz
沒有任何字段,則可以將其轉換為接口,並且數據類可以實現接口-盡管您仍然必須實現方法,但這將使您能夠使用相同的體系結構(迭代超類型參數集合)。 沒有按照您描述的方式使用數據類自動屬性的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.