kotlin面向对象的继承,都继承些什么呢?
我们可以把一个类实例化成为一个对象。这个类从其父类可以继承一些东西,从而让这个对象拥有了其父类所具有的一些特点,比如属性和方法。
建立一个抽象类 Person,Person 有自身的属性 age。Person有一个自身的抽象方法 work。
abstract class Person(val age:Int){
abstract fun work()
}
Person有不同的子类,有码农有医生,于是
class CodeFarmer(age: Int):Person(age){
override fun work() {
println("我是码农,${age}岁了,我在写代码。")
}
}
class Doctor(age: Int):Person(age){
override fun work() {
println("我是医生,${age}岁了,我在给病人看病。")
}
}
我们现在看到了两个人,一个码农,一个医生。让这两个人都各自去工作好了。
fun main(args: Array) {
val person:Person = CodeFarmer(45)
person.work()
val person2:Person = Doctor(50)
person2.work()
}
运行一下,发现这两个人一边工作一边介绍自己。哈哈!
我是码农,45岁了,我在写代码。
我是医生,50岁了,我在给病人看病。
好吧,码农是个老码农,医生也是个老医生了。
如果只是这样的继承,没什么意义。我们让码农拥有一种能力,自己改变年龄属性。(为什么有这个能力?因为代码都能改变世界,改个年龄不在话下。)
class CodeFarmer(age: Int):Person(age){
override val age:Int
get() = 27
override fun work() {
println("我是码农,${age}岁了,我在写代码。")
}
}
这个时候,码农拥有了自己的年龄的属性,可是代码确显示说有错误。
原来是父类 Person 中的 age 属性,它应当被设置为 open 才能够被继承和修改。于是我们也改一下 Person 类。
abstract class Person(open val age:Int){
abstract fun work()
}
再运行代码,就发现,码农年轻了。这是因为科技让人做到了长生不老吗?哈哈!
我是码农,27岁了,我在写代码。
我是医生,50岁了,我在给病人看病。
再举一个例子。职场中,每个人都有自己的职责,司机负责驾驶,秘书负责写稿,而经理对司机和秘书进行管理和分配工作,形成整体的能力。
先看司机和秘书的类,首先他们分别是驾驶者和写手,我们用接口来代表这两种能力。
interface Driver{
fun drive()
}
interface Writer{
fun write()
}
然后司机和秘书分别继承这两个接口,具有相应的能力。
class CarDriver:Driver{
override fun drive() {
println("开车呢")
}
}
class DraftWriter:Writer{
override fun write() {
println("写稿子呢")
}
}
然后该这两位的经理上场了,他可以安排他们工作,相当与他们是经理的工作属性一样。但是,他们不是继承关系,因为,司机和秘书随时可以被新的司机和秘书顶替掉。他们只是经理的属性的扩展而已,那么经理这个类,只是继承了这两个类的属性。我们可以通过接口来实现。kotlin 本身也不允许继承多个类。
class SuperManager(val driver: Driver, val writer: Writer):Driver by driver, Writer by writer
让他们工作的代码
fun main(args: Array) {
val driver = CarDriver()
val writer = DraftWriter()
val superManager = SuperManager(driver,writer)
superManager.drive()
superManager.write()
}
果然,司机和秘书的能力都被经理合并为集体的能力了。
运行结果
开车呢
写稿子呢
面向对象就是这样的。人生也是这样的。呵呵!