我有一個包含自定義資料類的密封類。這些資料類中的一些存盤了相同的變數x,如:
sealed class Example {
data class foo1(var timestamp: String? , var model1: Model1?)。Example()
data class foo2(var timestamp: String? , var model2: Model2?)。Example()
data class foo3(var model3: Model3?)。) Example()
Model3還應該包含一個時間戳變數。
我想做的事情是這樣的:
我想做的事情是這樣的:
when(foo) {
is Foo1, is Foo2 -> {
//運行相同的代碼。
foo.timestamp = ts
}
is Foo3 -> {
//運行不同的代碼
foo.model3.timestamp = ts
}
}
但我在這方面遇到了問題,因為當我在第一個 "是 "塊上執行上述操作時,我得到了 "timestamp "的未解決參考。 只有當我單獨參考每種型別并為每種型別運行相同的代碼塊時,它才會起作用,這在物件型別較多的情況下看起來非常難看。
我是否有辦法完成上述操作并使其發揮作用,或者是否有任何建議表明我應該重組我的方法以使其發揮作用?
uj5u.com熱心網友回復:
給超型別一個抽象的var。
sealed class Example{
abstract var timestamp: String?
data class foo1(override var timeestamp: String?, var model1: Model1?)。例子()
data class foo2(override var timeestamp: String?, var model2: Model2?)。例子()
data class foo3(var model3: Model3? Example() {
override var timestamp: String?
get() = model3.timestamp
set(value) { model3?.timestamp = value }
}
}
那么你甚至不需要使用when:
foo.timestamp = ts
uj5u.com熱心網友回復:
你可以創建另一個帶有公共變數的密封類,該類繼承自基礎密封類,并將這個密封類作為具有公共變數的類的父類。
sealed class Example{
sealed class Timestamp : Example() {
abstract var timestamp: String?
}
data class foo1(override var timeestamp: String?, var model1: Model1?)。時間戳()
data class foo2(override var Timestamp: String?, var model2: Model2?)。時間戳()
data class foo3(var model3: Model3? 例子()
}
when(foo) {
is Timestamp -> {
//run same piece of code
foo.timestamp = ts
}
is Foo3 -> {
//運行不同的代碼。
}
}
在kotlin 1.5中,這兩個密封的類都可以被宣告為密封的介面
。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/306696.html
標籤:
