Kotlin实现智能设备操作仅在开启状态下执行的方法咨询
解决方案
要实现仅在设备开启(deviceStatus为"on")时执行操作,核心是在每个需要限制的操作前添加状态检查。以下是具体修改方案:
1. 给父类添加状态检查方法
在SmartDevice中添加统一的状态判断方法,避免子类重复编写相同逻辑:
open class SmartDevice(val name: String, val category: String) { var deviceStatus = "online" protected set open val deviceType = "unknown" open fun turnOn() { deviceStatus = "on" } open fun turnOff() { deviceStatus = "off" } open fun printDeviceInfo() { println("Device name: $name, category: $category, type: $deviceType") } // 新增:统一判断设备是否开启的方法 protected fun isDeviceOn(): Boolean { return deviceStatus == "on" } }
2. 子类操作中加入状态判断
在SmartTvDevice和SmartLightDevice的功能方法里,先通过isDeviceOn()验证状态,仅在设备开启时执行操作:
修改SmartTvDevice的操作方法
class SmartTvDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) { override val deviceType = "Smart TV" private var speakerVolume by RangeRegulator(initialValue = 2, minValue = 0, maxValue = 100) private var channelNumber by RangeRegulator(initialValue = 1, minValue = 0, maxValue = 200) fun increaseSpeakerVolume() { if (isDeviceOn()) { speakerVolume++ println("Speaker volume increased to $speakerVolume.") } else { println("Cannot adjust volume: $name is not turned on.") } } fun nextChannel() { if (isDeviceOn()) { channelNumber++ println("Channel number increased to $channelNumber.") } else { println("Cannot change channel: $name is not turned on.") } } override fun turnOn() { super.turnOn() println( "$name is turned on. Speaker volume is set to $speakerVolume and channel number is " + "set to $channelNumber." ) } override fun turnOff() { super.turnOff() println("$name turned off") } fun decreaseVolume() { if (isDeviceOn()) { speakerVolume-- println("Speaker volume decreased to $speakerVolume") } else { println("Cannot adjust volume: $name is not turned on.") } } fun previousChannel() { if (isDeviceOn()) { channelNumber-- println("Channel number decreased to $channelNumber") } else { println("Cannot change channel: $name is not turned on.") } } }
修改SmartLightDevice的操作方法
class SmartLightDevice(deviceName: String, deviceCategory: String) : SmartDevice(name = deviceName, category = deviceCategory) { override val deviceType = "Smart Light" private var brightnessLevel by RangeRegulator(initialValue = 0, minValue = 0, maxValue = 100) fun increaseBrightness() { if (isDeviceOn()) { brightnessLevel++ println("Brightness increased to $brightnessLevel.") } else { println("Cannot adjust brightness: $name is not turned on.") } } override fun turnOn() { super.turnOn() brightnessLevel = 2 println("$name turned on. The brightness level is $brightnessLevel.") } override fun turnOff() { super.turnOff() brightnessLevel = 0 println("Smart Light turned off") } fun decreaseBrightness() { if (isDeviceOn()) { brightnessLevel-- println("Brightness decreased to $brightnessLevel") } else { println("Cannot adjust brightness: $name is not turned on.") } } }
3. 修复SmartHome类的错误
原代码中increaseTvVolume方法参数写法错误,修正为内部状态判断:
class SmartHome( val smartTvDevice: SmartTvDevice, val smartLightDevice: SmartLightDevice ) { var deviceTurnOnCount = 0 private set fun turnOnTv() { deviceTurnOnCount++ smartTvDevice.turnOn() } fun turnOffTv() { deviceTurnOnCount-- smartTvDevice.turnOff() } fun increaseTvVolume() { if (smartTvDevice.isDeviceOn()) { smartTvDevice.increaseSpeakerVolume() } else { println("Cannot adjust TV volume: ${smartTvDevice.name} is not turned on.") } } fun changeTvChannelToNext() { if (smartTvDevice.isDeviceOn()) { smartTvDevice.nextChannel() } else { println("Cannot change TV channel: ${smartTvDevice.name} is not turned on.") } } fun turnOnLight() { deviceTurnOnCount++ smartLightDevice.turnOn() } fun turnOffLight() { deviceTurnOnCount-- smartLightDevice.turnOff() } fun increaseLightBrightness() { if (smartLightDevice.isDeviceOn()) { smartLightDevice.increaseBrightness() } else { println("Cannot adjust light brightness: ${smartLightDevice.name} is not turned on.") } } fun turnOffAllDevices() { turnOffTv() turnOffLight() } }
4. 修正main函数的类型问题
原main函数中,父类类型SmartDevice无法直接调用子类方法,调整为对应子类类型或使用安全转型:
fun main() { // 操作电视 val tv = SmartTvDevice("Android TV", "Entertainment") tv.turnOn() tv.increaseSpeakerVolume() tv.nextChannel() tv.turnOff() tv.increaseSpeakerVolume() // 此时会提示无法操作 // 操作智能灯 val light = SmartLightDevice("Google Light", "Utility") light.turnOn() light.decreaseBrightness() light.turnOff() light.increaseBrightness() // 此时会提示无法操作 // 打印设备信息 val smartDevice: SmartDevice = tv smartDevice.printDeviceInfo() }
额外优化建议
将deviceStatus改为枚举类型,避免字符串拼写错误:
enum class DeviceStatus { ONLINE, ON, OFF } open class SmartDevice(val name: String, val category: String) { var deviceStatus = DeviceStatus.ONLINE protected set open fun turnOn() { deviceStatus = DeviceStatus.ON } open fun turnOff() { deviceStatus = DeviceStatus.OFF } protected fun isDeviceOn(): Boolean { return deviceStatus == DeviceStatus.ON } // ... 其他原有代码 ... }
枚举类型比字符串更安全,能避免因拼写失误导致的逻辑错误。
内容的提问来源于stack exchange,提问作者vukica
相关产品推荐
相关产品推荐

