- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我是 Kotlin 的初学者,我使用 Code A 来定义一个复杂的类 MDetail
, 并使用代码 B 创建对象 aMDetail1
,它可以工作。
但是如果我包含一个新的数据类,例如 ScreenDef
,数据构造太糟糕了,无法扩展。在 MDetail
就像代码 C 一样,所有旧代码都必须重写。
对于包含一些类的复杂类,是否有良好的数据构造?希望以后数据 build 可以轻松扩展!
代码 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
)
代码 B
var mBluetoothDef1= BluetoothDef()
var mWiFiDef1= WiFiHelper(this).getWiFiDefFromSystem()
var aMDetail1= MDetail(7L,mBluetoothDef1,mWiFiDef1)
代码 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
...
)
以下代码基于 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){ }
}
版本 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
帮助
我必须用开放类替换接口(interface),因为我无法从 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()
}
}
最佳答案
我建议执行以下操作:您的单元(Wifi、蓝牙等)应由接口(interface)抽象(至少作为标记),可以命名为 DeviceDef
.
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
MDetail
类可以用这些设备的变量列表来实例化,这样当新设备时不需要修改,例如ScreenDef
, 被添加:
class MDetail(val _id: Long, val devices: List<DeviceDef>)
内部 MDetail
,您可以提供过滤这些设备的方法:
class MDetail(val _id: Long, val devices: List<DeviceDef>) {
inline fun <reified T> getDevice(): T {
return devices.filterIsInstance(T::class.java).first()
}
}
现在,使用 WifiDef
非常简单例如:
fun main(args: Array<String>) {
val btD = BluetoothDef()
val wfD = WiFiDef("")
val m = MDetail(7L, listOf(btD, wfD, ScreenDef("", 1)))
println(m.getDevice<WiFiDef>())
}
我希望这会有所帮助。如果没有,您可能需要提供更多关于如何 MDetail
的详细信息。应该可以工作。
关于java - 如何设计一个包含一些类的复杂类,以便将来在 Kotlin 中更容易扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47586213/
我正在开发一个包含大量类的项目,我想将它们编译成 jar。我知道入口点和manifest.txt以及我的jar中的所有需要的项目,我的类都已编译并具有.class文件和所有内容,但问题是我必须将所
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在我的计算结束时,我打印结果: System.out.println("\nTree\t\tOdds of being by the sought author"); for (ParseTree p
我有一个具有多个时间范围的数据,例如考虑以下列 | from1 | to1 | from2 | to2 | from3 | to3 | | 06:00 | 07:30 | 09:30 |
我对 JavaScript 和 jQuery 相当缺乏经验,但对于我正在处理的 ASP.Net 网站,我需要两者。我正在慢慢弄清楚,但我一直严重依赖 StackOverFlow。 有谁知道有什么工具(
我正在考虑用 PHP 编写一些代码来更改图像的所有 id 以匹配其 alt。在 jQuery 中这会更容易实现吗? 我需要做的是走这条线 img alt="拼图"src="images/cole.jp
鉴于 websinte 的结构
假设我有 struct Value { int foo(); }; size_t *begin = ..., *end = ...; 如果我想在 C++03 中对一堆 Value 索
我开始创建一个将与公共(public) API 交互的 iPhone 应用程序。 我的问题是,使用 XML 还是 JSON 哪个更快和/或更容易? 最佳答案 根据 Sam Soffes , Touch
如果 PHP 是用 C 编写的,那么用 PHP 编写服务器端脚本与用 C 编写服务器端脚本究竟有什么区别,尤其是如果我使用的是 C 的 Web 框架可以处理 mysql 连接、SESSIONS 等?
我记得有一次看到一个人做的一个项目,他用某种语言用类似 json 的字符串编写了这样的东西,创建了非常好的 html。有没有类似的东西我可以用于 C# 或 .NET radio-box{ AName,
我的一位网页设计师 friend 仍在使用表格制作网站,但他使用 css 非常好,我也很好地使用 css,但使用 而且我在布局方面比我的 friend 更多地面临跨浏览器问题。 我向我的 friend
我想创建一个图,在那里可以看到 x 轴的替代刻度,例如pi/2, pi, 3pi/2, 等等。到目前为止,这对我来说只适用于一个相当不方便的代码(看看我创建的行 pi.halfs , pi.fulls
我是一名优秀的程序员,十分优秀!