DRM数字广播技术解析与全球运营实践
2026/9/23 6:50:04
用一段示例代码来讲解下kotlin的类,讲一下每一部分在干什么、为什么这么写,以及它们之间的关系。
SmartDeviceopenclassSmartDevice(valname:String,valcategory:String){vardeviceStatus="online"protectedsetopenvaldeviceType="unknown"openfunturnOn(){deviceStatus="on"}openfunturnOff(){deviceStatus="off"}}关键点:
open class
final,不能被继承。open表示:允许其他类继承它。构造函数参数直接变成属性
valname:String,valcategory:String等价于在类里声明只读属性name、category并在构造时赋值。
deviceStatus+protected set
vardeviceStatus="online"protectedsetdeviceStatus;protected set),外部不能做deviceStatus = "xxx"。turnOn()/turnOff()之类的方法来改变。open val deviceType、open fun turnOn/turnOff
override它们,做出更具体的实现。SmartTvDeviceclassSmartTvDevice(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")}}要点:
继承写法
classSmartTvDevice(...):SmartDevice(name=deviceName,category=deviceCategory):表示继承。override val deviceType
deviceType,让电视设备显示为"Smart TV"。speakerVolume/channelNumber使用委托属性
privatevarspeakerVolumebyRangeRegulator(...)by关键字表示属性委托(delegated property)。RangeRegulator实现了ReadWriteProperty<Any?, Int>,因此可以接管这个属性的get/set行为。override fun turnOn()
super.turnOn(),保持父类的通用逻辑(把deviceStatus改成"on")。SmartLightDeviceclassSmartLightDevice(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控制取值范围。
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()}}要点:
SmartHome不继承任何设备,而是组合(Has-a):
SmartTvDevice和SmartLightDevice两个属性。deviceTurnOnCount+private set
提供一组高层方法
turnOnTv()、turnOnLight()等,相当于对内部设备进行“统一控制”,这是典型的「封装」和「门面/facade」模式。RangeRegulatorclassRangeRegulator(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}}}这是整个示例中最“高级”的部分:自定义属性委托。
ReadWriteProperty<Any?, Int>
kotlin.properties,是一个接口:interfaceReadWriteProperty<inR,T>{operatorfungetValue(thisRef:R,property:KProperty<*>):ToperatorfunsetValue(thisRef:R,property:KProperty<*>,value:T)}R是“拥有这个属性的对象”的类型;这里用Any?,表示不关心谁在用它。T是属性类型,这里是Int。fieldData保存真正的值。
speakerVolume/brightnessLevel的读写,最终都落在fieldData上。setValue中做范围检查:
if(valueinminValue..maxValue){fieldData=value}效果:你在类里写的代码只是:
speakerVolume++// 看起来就是普通 IntbrightnessLevel=2000// 实际上不会被设置,超出范围但背后逻辑已经被RangeRegulator统一接管了,达到“逻辑复用 + 解耦”的目的。
SmartDevice引用指向不同子类funmain(){varsmartDevice:SmartDevice=SmartTvDevice("Android TV","Entertainment")smartDevice.turnOn()smartDevice=SmartLightDevice("Google Light","Utility")smartDevice.turnOn()}SmartDevice,但实际对象是不同的子类:SmartTvDeviceSmartLightDevicesmartDevice.turnOn()时,会根据实际类型调用对应子类的重写方法,这就是多态 (polymorphism)。你会看到输出先是电视开机的信息,再是灯开灯的信息。
示例刚好涵盖了:
val name: String)private/protected set/private setSmartHome拥有多个设备)by RangeRegulator+ReadWriteProperty)