当前位置: 首页 > 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.jsqmd.com/news/194795/

相关文章:

  • 基于SpringBoot的演唱会门票购票网站系统毕业设计项目源码
  • 深度学习毕设选题推荐:基于人工智能 python的人脸识别系统设计与实现
  • 基于SpringBoot的医院人事管理系统的设计与实现毕业设计项目源码
  • 系统架构设计师(软考高级)设计模式备考指南
  • 基于SpringBoot的服装商城销售系统毕业设计项目源码
  • 计算机深度学习毕设实战-基于python的人脸识别系统设计与实现人工智能
  • 基于SpringBoot的一站式公务员备考系统的设计与实现毕业设计项目源码
  • 会话(Session)与Cookie的原理、应用与安全实践
  • 2026临沂月子中心top5推荐榜公布:南坊等地优质品牌深度解析及选择指南 - 全局中转站
  • 深度学习毕设项目:机器学习基于python的人脸识别系统设计与实现
  • kettle从入门到精通 第113课 ETL之webspoon 多行转一行或者多行数据合并为一行
  • 【从0到1】独立游戏开发者AI指南
  • 打开cmd的方式以及常用的dos命令学习
  • Leetcode 25. K 个一组翻转链表 JavaScript (Day 12)
  • JavaScript数组some()和every()方法最佳实践
  • Spring-boot读书笔记一lombok
  • 2026最新辣椒油/辣椒蘸料/油泼辣子/红油/油辣子品牌首要推荐椒上飞:百年非遗传承,川味调味专家之选 - 全局中转站
  • 【】reuse
  • 【】reuse原理
  • 基于Java+SpringBoot的停车场管理系统(源码+lw+部署文档+讲解等)
  • 完整教程:盛世宏博档案库房温湿度及安防一体化监控系统架构解析
  • 基于SpringBoot的音乐舞台剧分类赏析系统毕业设计项目源码
  • Kotlin类定义与使用全指南
  • 基于Java+SpringBoot的外卖系统(源码+lw+部署文档+讲解等)
  • 深度测评 8个一键生成论文工具:本科生毕业论文痛点全解析
  • Leetcode 138. 随机链表的复制 (Day 12)
  • 基于微信小程序的养老服务平台系统毕业设计项目源码
  • 基于大数据挖掘技术的台风灾害预测系统(源码+lw+部署文档+讲解等)
  • springboot基于大数据的购物平台用户行为分析vue
  • 医疗健康领域的大数据运营:精准医疗的数据支撑