我是Kotlin的初学者,我使用代码A来定义一个复杂的类MDetail,并使用代码B来创建一个对象aMDetail1,它可以工作.
但数据结构是太糟糕了扩大,如果我有一个新的数据类如ScreenDef中MDetail 就像代码C,所有旧的代码必须rewriten.
对于包含某些类的复杂类,是否有良好的数据结构?我希望将来数据构建可以轻松扩展!
代码A.
data class BluetoothDef(val Status:Boolean=false)
data class WiFiDef(val Name:String, val Status:Boolean=false)
data class MDetail (
val _id: Long,
val bluetooth: BluetoothDef,
val wiFi:WiFiDef
)
Run Code Online (Sandbox Code Playgroud)
代码B.
var mBluetoothDef1= BluetoothDef()
var mWiFiDef1= WiFiHelper(this).getWiFiDefFromSystem()
var aMDetail1= MDetail(7L,mBluetoothDef1,mWiFiDef1)
Run Code Online (Sandbox Code Playgroud)
代码C.
data class BluetoothDef(val Status:Boolean=false)
data class WiFiDef(val Name:String, val Status:Boolean=false)
data class ScreenDef(val Name:String, val size:Long)
...
data class MDetail (
val _id: Long,
val bluetooth: BluetoothDef,
val wiFi:WiFiDef
val aScreenDef:ScreenDef
...
)
Run Code Online (Sandbox Code Playgroud)
以下代码基于s1m0nw1所说的内容,我认为将来很容易扩展.谢谢!
还有其他更好的方法吗?
版本1代码
interface DeviceDef
data class BluetoothDef(val Status: Boolean = false) : DeviceDef
data class WiFiDef(val Name: String, val Status: Boolean = false) : DeviceDef
data class ScreenDef(val Name: String, val size: Long) : DeviceDef
class MDetail(val _id: Long, val devices: MutableList<DeviceDef>) {
inline fun <reified T> getDevice(): T {
return devices.filterIsInstance(T::class.java).first()
}
}
class UIMain : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_main)
val btD = BluetoothDef(true)
val wfD = WiFiDef("MyWifi")
val xSc = ScreenDef("MyScreen", 1)
val m = MDetail(7L, mutableListOf(btD, wfD, xSc))
handleBluetoothDef(m.getDevice<BluetoothDef>())
handleWiFiDef(m.getDevice<WiFiDef>())
handleScreenDef(m.getDevice<ScreenDef>())
}
fun handleBluetoothDef(mBluetoothDef:BluetoothDef){ }
fun handleWiFiDef(mWiFiDef:WiFiDef){ }
fun handleScreenDef(mScreenDef:ScreenDef){ }
}
Run Code Online (Sandbox Code Playgroud)
版本2代码(扩展)
interface DeviceDef
data class BluetoothDef(val Status: Boolean = false) : DeviceDef
data class WiFiDef(val Name: String, val Status: Boolean = false) : DeviceDef
data class ScreenDef(val Name: String, val size: Long) : DeviceDef
data class TimeLine(val Name: String): DeviceDef //Extend
class MDetail(val _id: Long, val devices: MutableList<DeviceDef>) {
inline fun <reified T> getDevice(): T {
return devices.filterIsInstance(T::class.java).first()
}
}
class UIMain : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_main)
val btD = BluetoothDef(true)
val wfD = WiFiDef("MyWifi")
val xSc = ScreenDef("MyScreen", 1)
val aTe = TimeLine("MyTimeline") //Extend
val m = MDetail(7L, mutableListOf(btD, wfD, xSc,aTe)) //Modified
handleBluetoothDef(m.getDevice<BluetoothDef>())
handleWiFiDef(m.getDevice<WiFiDef>())
handleScreenDef(m.getDevice<ScreenDef>())
handleTimeLine(m.getDevice<TimeLine>()) //Extend
}
fun handleBluetoothDef(mBluetoothDef:BluetoothDef){}
fun handleWiFiDef(mWiFiDef:WiFiDef){ }
fun handleScreenDef(mScreenDef:ScreenDef){ }
fun handleTimeLine(mTimeLine:TimeLine){} //Extend
Run Code Online (Sandbox Code Playgroud)
救命
我必须用open类替换接口,因为我无法从json字符串GSON反序列化MDetail对象.
但乐趣inline fun <reified T> getDevice(): T{ }无法返回正确的结果,我该如何修改?谢谢!
open class DeviceDef
data class BluetoothDef(val status:Boolean=false): DeviceDef()
data class WiFiDef(val name:String, val status:Boolean=false) : DeviceDef()
data class MDetail(val _id: Long, val deviceList: MutableList<DeviceDef>)
{
inline fun <reified T> getDevice(): T {
return deviceList.filterIsInstance(T::class.java).first()
}
}
Run Code Online (Sandbox Code Playgroud)
Gar*_*wzh -1
每次向 中添加新属性时MDetail,请将新属性标记为可为空并将默认值设置为 null。像这样
data class MDetail (
val _id: Long,
val bluetooth: BluetoothDef,
val wiFi: WiFiDef,
val screen: ScreenDef? = null,
...
)
Run Code Online (Sandbox Code Playgroud)
不要忘记在创建新实例时提供特定的属性名称,如下所示
var aMDetail1= MDetail(7L, mBluetoothDef1, mWiFiDef1, screen = mScreenDef1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |