kotlin 确保操作只能在特定条件下执行?

ux6nzvsh  于 2023-11-21  发布在  Kotlin
关注(0)|答案(2)|浏览(329)

我是Kotlin的新手,我一直在想,如果满足某个条件,我怎么能告诉程序它只能执行某些功能。比如,如果电视打开,你只能增加TvVolume,或者如果电视打开,你只能改变频道。这是Kotlin课程的练习,我被卡住了,或者只是想多了。下面是我的代码:(我试图在SmartHome类中实现那个条件)

  1. `
  2. open class SmartDevice(val name: String, val category: String) {
  3. var deviceStatus = "online"
  4. protected set
  5. open val deviceType = "unknown"
  6. open fun turnOn() {
  7. deviceStatus = "on"
  8. }
  9. open fun turnOff() {
  10. deviceStatus = "off"
  11. }
  12. open fun printDeviceInfo() {
  13. println("Device name: $name, category: $category, type: $deviceType")
  14. }
  15. }
  16. class SmartTvDevice(deviceName: String, deviceCategory: String) :
  17. SmartDevice(name = deviceName, category = deviceCategory) {
  18. override val deviceType = "Smart TV"
  19. private var speakerVolume by RangeRegulator(initialValue = 2, minValue = 0, maxValue = 100)
  20. private var channelNumber by RangeRegulator(initialValue = 1, minValue = 0, maxValue = 200)
  21. fun increaseSpeakerVolume() {
  22. speakerVolume++
  23. println("Speaker volume increased to $speakerVolume.")
  24. }
  25. fun nextChannel() {
  26. channelNumber++
  27. println("Channel number increased to $channelNumber.")
  28. }
  29. override fun turnOn() {
  30. super.turnOn()
  31. println(
  32. "$name is turned on. Speaker volume is set to $speakerVolume and channel number is " +
  33. "set to $channelNumber."
  34. )
  35. }
  36. override fun turnOff() {
  37. super.turnOff()
  38. println("$name turned off")
  39. }
  40. fun decreaseVolume() {
  41. speakerVolume--
  42. println("Speaker volume decreased to $speakerVolume")
  43. }
  44. fun previousChannel() {
  45. channelNumber--
  46. println("Channel number decreased to $channelNumber")
  47. }
  48. }
  49. class SmartLightDevice(deviceName: String, deviceCategory: String) :
  50. SmartDevice(name = deviceName, category = deviceCategory) {
  51. override val deviceType = "Smart Light"
  52. private var brightnessLevel by RangeRegulator(initialValue = 0, minValue = 0, maxValue = 100)
  53. fun increaseBrightness() {
  54. brightnessLevel++
  55. println("Brightness increased to $brightnessLevel.")
  56. }
  57. override fun turnOn() {
  58. super.turnOn()
  59. brightnessLevel = 2
  60. println("$name turned on. The brightness level is $brightnessLevel.")
  61. }
  62. override fun turnOff() {
  63. super.turnOff()
  64. brightnessLevel = 0
  65. println("Smart Light turned off")
  66. }
  67. fun decreaseBrightness() {
  68. brightnessLevel--
  69. println("Brightness decreased to $brightnessLevel")
  70. }
  71. }
  72. class SmartHome(
  73. val smartTvDevice: SmartTvDevice,
  74. val smartLightDevice: SmartLightDevice
  75. ) {
  76. var deviceTurnOnCount = 0
  77. private set
  78. fun turnOnTv() {
  79. deviceTurnOnCount++
  80. smartTvDevice.turnOn()
  81. }
  82. fun turnOffTv() {
  83. deviceTurnOnCount--
  84. smartTvDevice.turnOff()
  85. }
  86. fun increaseTvVolume(deviceStatus -> "on") {
  87. smartTvDevice.increaseSpeakerVolume()
  88. }
  89. fun changeTvChannelToNext() {
  90. smartTvDevice.nextChannel()
  91. }
  92. fun turnOnLight() {
  93. deviceTurnOnCount++
  94. smartLightDevice.turnOn()
  95. }
  96. fun turnOffLight() {
  97. deviceTurnOnCount--
  98. smartLightDevice.turnOff()
  99. }
  100. fun increaseLightBrightness() {
  101. smartLightDevice.increaseBrightness()
  102. }
  103. fun turnOffAllDevices() {
  104. turnOffTv()
  105. turnOffLight()
  106. }
  107. }
  108. class RangeRegulator(
  109. initialValue: Int,
  110. private val minValue: Int,
  111. private val maxValue: Int
  112. ) : ReadWriteProperty<Any?, Int> {
  113. var fieldData = initialValue
  114. override fun getValue(thisRef: Any?, property: KProperty<*>): Int {
  115. return fieldData
  116. }
  117. override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
  118. if (value in minValue..maxValue) {
  119. fieldData = value
  120. }
  121. }
  122. }
  123. fun main() {
  124. var smartDevice: SmartDevice = SmartTvDevice("Android TV", "Entertainment")
  125. smartDevice.turnOn()
  126. smartDevice = SmartLightDevice("Google Light", "Utility")
  127. smartDevice.turnOn()
  128. smartDevice.decreaseBrightness()
  129. smartDevice = SmartTvDevice("Android TV", "Entertainment" )
  130. smartDevice.printDeviceInfo()
  131. smartDevice.increaseSpeakerVolume()
  132. smartDevice.increaseSpeakerVolume()
  133. smartDevice.increaseSpeakerVolume()
  134. smartDevice.increaseSpeakerVolume()
  135. smartDevice.increaseSpeakerVolume()
  136. smartDevice.decreaseVolume()
  137. }
  138. ` }

字符串
我肯定想多了
问题是,如果deviceStatus不是“on”,我希望所有这些操作都变得无法实现

yftpprvb

yftpprvb1#

尝试以下步骤:
创建函数isDeviceOn(),返回Boolean

  1. open fun isDeviceOn() : Boolean {
  2. return this.deviceStatus == "online" || this.deviceStatus == "on"
  3. }

字符串
使用此函数,您可以检查deviceStatus是否等于"online""on"。如果满足这些条件之一,则函数返回true,否则返回false
如果需要从类内部检查设备是否打开 *,可以直接使用

  1. if (this.isDeviceOn()) {
  2. // Device is on
  3. } else {
  4. // Device is off
  5. }


如果您有SmartDevice**示例,则可以使用

  1. val device = SmartDevice(...)
  2. if (device.isDeviceOn()) {
  3. // Device is on
  4. } else {
  5. // Device is off
  6. }

展开查看全部
oxf4rvwz

oxf4rvwz2#

正如我所说的,我想多了。我用一个简单的if语句做了我想做的事情:

  1. ` fun increaseSpeakerVolume() {
  2. if (deviceStatus == "on") {
  3. speakerVolume++
  4. println("Speaker volume increased to $speakerVolume.")
  5. }
  6. }`

字符串
我对每个函数都做了。当我运行它的时候:

  1. `smartDevice.turnOff(); smartDevice.increaseSpeakerVolume()`


我明白了:
Android TV关闭
当我跑步时:

  1. smartDevice.turnOn(); smartDevice.increaseSpeakerVolume()


我明白了:
Android TV已打开。扬声器音量设置为1,频道号设置为1。扬声器音量增加到2。

展开查看全部

相关问题