kotlin面向?qū)ο蟮睦^承,都繼承些什么呢?
我們可以把一個類實例化成為一個對象扰她。這個類從其父類可以繼承一些東西,從而讓這個對象擁有了其父類所具有的一些特點芭碍,比如屬性和方法徒役。
建立一個抽象類 Person,Person 有自身的屬性 age窖壕。Person有一個自身的抽象方法 work忧勿。
abstract class Person(val age:Int){
abstract fun work()
}
Person有不同的子類,有碼農(nóng)有醫(yī)生瞻讽,于是
class CodeFarmer(age: Int):Person(age){
override fun work() {
println("我是碼農(nóng)鸳吸,${age}歲了,我在寫代碼速勇。")
}
}
class Doctor(age: Int):Person(age){
override fun work() {
println("我是醫(yī)生晌砾,${age}歲了,我在給病人看病烦磁。")
}
}
我們現(xiàn)在看到了兩個人养匈,一個碼農(nóng),一個醫(yī)生个初。讓這兩個人都各自去工作好了乖寒。
fun main(args: Array<String>) {
val person:Person = CodeFarmer(45)
person.work()
val person2:Person = Doctor(50)
person2.work()
}
運行一下,發(fā)現(xiàn)這兩個人一邊工作一邊介紹自己院溺。哈哈!
我是碼農(nóng)磅轻,45歲了珍逸,我在寫代碼逐虚。
我是醫(yī)生,50歲了谆膳,我在給病人看病叭爱。
好吧,碼農(nóng)是個老碼農(nóng)漱病,醫(yī)生也是個老醫(yī)生了买雾。
如果只是這樣的繼承,沒什么意義杨帽。我們讓碼農(nóng)擁有一種能力漓穿,自己改變年齡屬性。(為什么有這個能力注盈?因為代碼都能改變世界晃危,改個年齡不在話下。)
class CodeFarmer(age: Int):Person(age){
override val age:Int
get() = 27
override fun work() {
println("我是碼農(nóng)老客,${age}歲了僚饭,我在寫代碼。")
}
}
這個時候胧砰,碼農(nóng)擁有了自己的年齡的屬性鳍鸵,可是代碼確顯示說有錯誤。
原來是父類 Person 中的 age 屬性尉间,它應(yīng)當(dāng)被設(shè)置為 open 才能夠被繼承和修改偿乖。于是我們也改一下 Person 類。
abstract class Person(open val age:Int){
abstract fun work()
}
再運行代碼乌妒,就發(fā)現(xiàn)汹想,碼農(nóng)年輕了。這是因為科技讓人做到了長生不老嗎撤蚊?哈哈古掏!
我是碼農(nóng),27歲了侦啸,我在寫代碼槽唾。
我是醫(yī)生,50歲了光涂,我在給病人看病庞萍。
再舉一個例子。職場中忘闻,每個人都有自己的職責(zé)钝计,司機負責(zé)駕駛,秘書負責(zé)寫稿,而經(jīng)理對司機和秘書進行管理和分配工作私恬,形成整體的能力债沮。
先看司機和秘書的類,首先他們分別是駕駛者和寫手本鸣,我們用接口來代表這兩種能力疫衩。
interface Driver{
fun drive()
}
interface Writer{
fun write()
}
然后司機和秘書分別繼承這兩個接口,具有相應(yīng)的能力荣德。
class CarDriver:Driver{
override fun drive() {
println("開車呢")
}
}
class DraftWriter:Writer{
override fun write() {
println("寫稿子呢")
}
}
然后該這兩位的經(jīng)理上場了闷煤,他可以安排他們工作,相當(dāng)與他們是經(jīng)理的工作屬性一樣涮瞻。但是鲤拿,他們不是繼承關(guān)系,因為饲宛,司機和秘書隨時可以被新的司機和秘書頂替掉皆愉。他們只是經(jīng)理的屬性的擴展而已,那么經(jīng)理這個類艇抠,只是繼承了這兩個類的屬性幕庐。我們可以通過接口來實現(xiàn)。kotlin 本身也不允許繼承多個類家淤。
class SuperManager(val driver: Driver, val writer: Writer):Driver by driver, Writer by writer
讓他們工作的代碼
fun main(args: Array<String>) {
val driver = CarDriver()
val writer = DraftWriter()
val superManager = SuperManager(driver,writer)
superManager.drive()
superManager.write()
}
果然异剥,司機和秘書的能力都被經(jīng)理合并為集體的能力了。
運行結(jié)果
開車呢
寫稿子呢
面向?qū)ο缶褪沁@樣的絮重。人生也是這樣的冤寿。呵呵!