You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:14:57