java – 如何在Kotlin中设计一个复杂的类,其中包含一些类以便于将来轻松扩展?

前端之家收集整理的这篇文章主要介绍了java – 如何在Kotlin中设计一个复杂的类,其中包含一些类以便于将来轻松扩展?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是Kotlin的初学者,我使用代码A来定义复杂的类MDetail,并使用代码B来创建一个对象aMDetail1,它可以工作.

但是数据结构太糟糕了,如果我像MD C一样在MDetail中包含一个新的数据类,比如ScreenDef,那么所有旧的代码都必须重写.

对于包含某些类的复杂类,是否有良好的数据结构?我希望将来数据构建可以轻松扩展!

代码A.

  1. data class BluetoothDef(val Status:Boolean=false)
  2. data class WiFiDef(val Name:String,val Status:Boolean=false)
  3.  
  4. data class MDetail (
  5. val _id: Long,val bluetooth: BluetoothDef,val wiFi:WiFiDef
  6. )

代码B.

  1. var mBluetoothDef1= BluetoothDef()
  2. var mWiFiDef1= WiFiHelper(this).getWiFiDefFromSystem()
  3. var aMDetail1= MDetail(7L,mBluetoothDef1,mWiFiDef1)

代码C.

  1. data class BluetoothDef(val Status:Boolean=false)
  2. data class WiFiDef(val Name:String,val Status:Boolean=false)
  3. data class ScreenDef(val Name:String,val size:Long)
  4. ...
  5.  
  6. data class MDetail (
  7. val _id: Long,val wiFi:WiFiDef
  8. val aScreenDef:ScreenDef
  9. ...
  10. )

以下代码基于s1m0nw1所说的内容,我认为将来很容易扩展.谢谢!

还有其他更好的方法吗?

版本1代码

  1. interface DeviceDef
  2.  
  3. data class BluetoothDef(val Status: Boolean = false) : DeviceDef
  4. data class WiFiDef(val Name: String,val Status: Boolean = false) : DeviceDef
  5. data class ScreenDef(val Name: String,val size: Long) : DeviceDef
  6.  
  7. class MDetail(val _id: Long,val devices: MutableList<DeviceDef>) {
  8. inline fun <reified T> getDevice(): T {
  9. return devices.filterIsInstance(T::class.java).first()
  10. }
  11. }
  12.  
  13. class UIMain : AppCompatActivity() {
  14.  
  15. override fun onCreate(savedInstanceState: Bundle?) {
  16. super.onCreate(savedInstanceState)
  17. setContentView(R.layout.layout_main)
  18.  
  19. val btD = BluetoothDef(true)
  20. val wfD = WiFiDef("MyWifi")
  21. val xSc = ScreenDef("MyScreen",1)
  22. val m = MDetail(7L,mutableListOf(btD,wfD,xSc))
  23.  
  24.  
  25. handleBluetoothDef(m.getDevice<BluetoothDef>())
  26. handleWiFiDef(m.getDevice<WiFiDef>())
  27. handleScreenDef(m.getDevice<ScreenDef>())
  28. }
  29.  
  30. fun handleBluetoothDef(mBluetoothDef:BluetoothDef){ }
  31. fun handleWiFiDef(mWiFiDef:WiFiDef){ }
  32. fun handleScreenDef(mScreenDef:ScreenDef){ }
  33. }

版本2代码(扩展)

  1. interface DeviceDef
  2.  
  3. data class BluetoothDef(val Status: Boolean = false) : DeviceDef
  4. data class WiFiDef(val Name: String,val size: Long) : DeviceDef
  5.  
  6. data class TimeLine(val Name: String): DeviceDef //Extend
  7.  
  8. class MDetail(val _id: Long,1)
  9.  
  10. val aTe = TimeLine("MyTimeline") //Extend
  11.  
  12. val m = MDetail(7L,xSc,aTe)) //Modified
  13.  
  14.  
  15. handleBluetoothDef(m.getDevice<BluetoothDef>())
  16. handleWiFiDef(m.getDevice<WiFiDef>())
  17. handleScreenDef(m.getDevice<ScreenDef>())
  18.  
  19. handleTimeLine(m.getDevice<TimeLine>()) //Extend
  20. }
  21.  
  22. fun handleBluetoothDef(mBluetoothDef:BluetoothDef){}
  23. fun handleWiFiDef(mWiFiDef:WiFiDef){ }
  24. fun handleScreenDef(mScreenDef:ScreenDef){ }
  25. fun handleTimeLine(mTimeLine:TimeLine){} //Extend

救命

我必须用open类替换接口,因为我无法从json字符串GSON反序列化MDetail对象.

但有趣的内联乐趣< reified T> getDevice():T {}无法返回正确的结果,我该怎么修改?谢谢!

  1. open class DeviceDef
  2.  
  3. data class BluetoothDef(val status:Boolean=false): DeviceDef()
  4. data class WiFiDef(val name:String,val status:Boolean=false) : DeviceDef()
  5.  
  6. data class MDetail(val _id: Long,val deviceList: MutableList<DeviceDef>)
  7. {
  8. inline fun <reified T> getDevice(): T {
  9. return deviceList.filterIsInstance(T::class.java).first()
  10. }
  11. }

解决方法

我建议执行以下操作:您的设备(Wifi,蓝牙等)应该通过接口(至少作为标记)抽象,可以命名为DeviceDef.
  1. interface DeviceDef
  2. data class BluetoothDef(val Status: Boolean = false) : DeviceDef
  3. data class WiFiDef(val Name: String,val size: Long) : DeviceDef

MDetail类可以使用这些设备的变量列表进行实例化,因此在添加新设备(如ScreenDef)时不需要进行任何修改

  1. class MDetail(val _id: Long,val devices: List<DeviceDef>)

在MDetail中,您可以提供过滤这些设备的方法

  1. class MDetail(val _id: Long,val devices: List<DeviceDef>) {
  2.  
  3. inline fun <reified T> getDevice(): T {
  4. return devices.filterIsInstance(T::class.java).first()
  5. }
  6. }

现在,使用WifiDef非常简单:

  1. fun main(args: Array<String>) {
  2. val btD = BluetoothDef()
  3. val wfD = WiFiDef("")
  4. val m = MDetail(7L,listOf(btD,ScreenDef("",1)))
  5. println(m.getDevice<WiFiDef>())
  6. }

我希望这有帮助.如果没有,您可能需要提供有关MDetail应如何工作的更多详细信息.

猜你在找的Java相关文章