当前位置: 首页 > news >正文

Kotlin类代码实战

用一段示例代码来讲解下kotlin的类,讲一下每一部分在干什么、为什么这么写,以及它们之间的关系。


1. 基类SmartDevice

openclassSmartDevice(valname:String,valcategory:String){vardeviceStatus="online"protectedsetopenvaldeviceType="unknown"openfunturnOn(){deviceStatus="on"}openfunturnOff(){deviceStatus="off"}}

关键点:

  1. open class

    • Kotlin 中类默认是final,不能被继承。
    • open表示:允许其他类继承它。
  2. 构造函数参数直接变成属性

    valname:String,valcategory:String

    等价于在类里声明只读属性namecategory并在构造时赋值。

  3. deviceStatus+protected set

    vardeviceStatus="online"protectedset
    • 外部代码可以读取deviceStatus
    • 但只有这个类和子类可以修改它(protected set),外部不能做deviceStatus = "xxx"
    • 这样可以保护状态,只允许通过turnOn()/turnOff()之类的方法来改变。
  4. open val deviceTypeopen fun turnOn/turnOff

    • 表示子类可以override它们,做出更具体的实现。

2. 子类SmartTvDevice

classSmartTvDevice(deviceName:String,deviceCategory:String):SmartDevice(name=deviceName,category=deviceCategory){overridevaldeviceType="Smart TV"privatevarspeakerVolumebyRangeRegulator(initialValue=2,minValue=0,maxValue=100)privatevarchannelNumberbyRangeRegulator(initialValue=1,minValue=0,maxValue=200)funincreaseSpeakerVolume(){speakerVolume++println("Speaker volume increased to$speakerVolume.")}funnextChannel(){channelNumber++println("Channel number increased to$channelNumber.")}overridefunturnOn(){super.turnOn()println("$nameis turned on. Speaker volume is set to$speakerVolumeand channel number is "+"set to$channelNumber.")}overridefunturnOff(){super.turnOff()println("$nameturned off")}}

要点:

  1. 继承写法

    classSmartTvDevice(...):SmartDevice(name=deviceName,category=deviceCategory)
    • 冒号:表示继承。
    • 括号里是父类构造函数的参数
  2. override val deviceType

    • 覆盖父类的deviceType,让电视设备显示为"Smart TV"
  3. speakerVolume/channelNumber使用委托属性

    privatevarspeakerVolumebyRangeRegulator(...)
    • by关键字表示属性委托(delegated property)。
    • RangeRegulator实现了ReadWriteProperty<Any?, Int>,因此可以接管这个属性的get/set行为。
    • 这里的效果:音量、频道的值会被自动限制在指定区间内(0…100、0…200)。
  4. override fun turnOn()

    • super.turnOn(),保持父类的通用逻辑(把deviceStatus改成"on")。
    • 再打印这个设备特有的信息(音量和频道)。

3. 子类SmartLightDevice

classSmartLightDevice(deviceName:String,deviceCategory:String):SmartDevice(name=deviceName,category=deviceCategory){overridevaldeviceType="Smart Light"privatevarbrightnessLevelbyRangeRegulator(initialValue=0,minValue=0,maxValue=100)funincreaseBrightness(){brightnessLevel++println("Brightness increased to$brightnessLevel.")}overridefunturnOn(){super.turnOn()brightnessLevel=2println("$nameturned on. The brightness level is$brightnessLevel.")}overridefunturnOff(){super.turnOff()brightnessLevel=0println("Smart Light turned off")}}

逻辑类似电视设备,只是属性换成了亮度brightnessLevel,并用同样的RangeRegulator控制取值范围。


4.SmartHome聚合多个设备

classSmartHome(valsmartTvDevice:SmartTvDevice,valsmartLightDevice:SmartLightDevice){vardeviceTurnOnCount=0privatesetfunturnOnTv(){deviceTurnOnCount++smartTvDevice.turnOn()}funturnOffTv(){deviceTurnOnCount--smartTvDevice.turnOff()}funincreaseTvVolume(){smartTvDevice.increaseSpeakerVolume()}funchangeTvChannelToNext(){smartTvDevice.nextChannel()}funturnOnLight(){deviceTurnOnCount++smartLightDevice.turnOn()}funturnOffLight(){deviceTurnOnCount--smartLightDevice.turnOff()}funincreaseLightBrightness(){smartLightDevice.increaseBrightness()}funturnOffAllDevices(){turnOffTv()turnOffLight()}}

要点:

  1. SmartHome不继承任何设备,而是组合(Has-a)

    • 拥有SmartTvDeviceSmartLightDevice两个属性。
    • 这就是“聚合 / 组合”的关系:家里有一个电视和一个灯。
  2. deviceTurnOnCount+private set

    • 对外暴露统计信息,但不允许外部随意修改计数,只能通过这些方法递增 / 递减。
  3. 提供一组高层方法

    • turnOnTv()turnOnLight()等,相当于对内部设备进行“统一控制”,这是典型的「封装」和「门面/facade」模式。

5. 属性委托类RangeRegulator

classRangeRegulator(initialValue:Int,privatevalminValue:Int,privatevalmaxValue:Int):ReadWriteProperty<Any?,Int>{varfieldData=initialValueoverridefungetValue(thisRef:Any?,property:KProperty<*>):Int{returnfieldData}overridefunsetValue(thisRef:Any?,property:KProperty<*>,value:Int){if(valueinminValue..maxValue){fieldData=value}}}

这是整个示例中最“高级”的部分:自定义属性委托

  1. ReadWriteProperty<Any?, Int>

    • 来自kotlin.properties,是一个接口:
      interfaceReadWriteProperty<inR,T>{operatorfungetValue(thisRef:R,property:KProperty<*>):ToperatorfunsetValue(thisRef:R,property:KProperty<*>,value:T)}
    • R是“拥有这个属性的对象”的类型;这里用Any?,表示不关心谁在用它。
    • T是属性类型,这里是Int
  2. fieldData保存真正的值。

    • 所有对speakerVolume/brightnessLevel的读写,最终都落在fieldData上。
  3. setValue中做范围检查:

    if(valueinminValue..maxValue){fieldData=value}
    • 只有新值在合法范围内时才更新。
    • 如果超出范围,会被默默忽略(可以根据需求改成抛异常、裁剪值等)。

效果:你在类里写的代码只是:

speakerVolume++// 看起来就是普通 IntbrightnessLevel=2000// 实际上不会被设置,超出范围

但背后逻辑已经被RangeRegulator统一接管了,达到“逻辑复用 + 解耦”的目的。


6. 多态的使用:SmartDevice引用指向不同子类

funmain(){varsmartDevice:SmartDevice=SmartTvDevice("Android TV","Entertainment")smartDevice.turnOn()smartDevice=SmartLightDevice("Google Light","Utility")smartDevice.turnOn()}
  • 变量类型是父类SmartDevice,但实际对象是不同的子类:
    1. 先指向SmartTvDevice
    2. 后指向SmartLightDevice
  • 调用smartDevice.turnOn()时,会根据实际类型调用对应子类的重写方法,这就是多态 (polymorphism)

你会看到输出先是电视开机的信息,再是灯开灯的信息。


7. 这个示例体现的 Kotlin / OOP 概念

示例刚好涵盖了:

  1. class / open class / 继承 / override
  2. 主构造函数 + 属性简写 (val name: String)
  3. 访问控制:private/protected set/private set
  4. 封装与组合(SmartHome拥有多个设备)
  5. 多态(父类引用指向子类实例)
  6. 属性委托(by RangeRegulator+ReadWriteProperty
http://www.cnnetsun.cn/news/422950.html

相关文章:

  • 第十课Open3D点云数据处理:均值滤波
  • 医疗健康领域的大数据运营:精准医疗的数据支撑
  • 前端考察【底层原理与浏览器内核】-浏览器渲染流水线
  • 基于定制开发开源AI智能名片S2B2C商城小程序的刚需类产品电商运营模式研究
  • 电脑配置流程(VR项目)
  • springboot学生学分学业预警管理系统vue
  • java基础-IO流(打印流)
  • AI应用架构师的智慧决策:AI驱动虚拟娱乐的战略规划
  • 【论文自动阅读】Dream2Flow: Bridging Video Generation and Open-World Manipulation with 3D Object Flow
  • 华为OD机试真题 - 支持优先级队列 (C++ Python JAVA JS GO)
  • 【Spring源码】getBean源码实战(七)——BeanPostProcessor与初始化方法
  • Java分页查询方式总结
  • Android 16安兔兔分辨率作假显示(非修改TextView方案)
  • typora快速下载(简单易学)
  • laravel的session_start(); 是在哪里调用的?
  • OpenAI重组团队开发语音AI硬件产品,2026年推出新模型
  • AI重塑工作格局:Mercor如何连接人才与智能体训练
  • Windows系统文件找不到的问题 如何下载文件修复?
  • 使用电脑Win系统时经常会出现丢失找不到某些文件的情况
  • 2024年五大颠覆性技术趋势
  • 托盘目标检测数据集VOC+YOLO格式4517张1类别
  • 大模型开发必备!一张图看懂AI Agent!五层架构深度剖析,从Prompt到Action的完整闭环
  • 未来已来!Android Studio的AI Agent让编程变得如此简单,开发者:这比antigravity还牛!小白也能秒变大神,不会你就真的out了!
  • springboot+vue电影推荐系统springboot协同过滤
  • 基于非对称纳什谈判的多微网电能共享运行优化:MATLAB 实现探秘
  • 笔记本外接屏突然黑屏?我踩了 3 个坑,最后靠回退 N 卡驱动救了急
  • 2025年APP开发公司口碑排行榜单权威发布
  • 开关电流降压型DC-DC转换器D7015解析
  • 网站没有安装SSL证书会有影响吗?
  • 学长亲荐9个AI论文网站,助你轻松搞定本科论文!