1.什么是繼承颗圣?繼承有什么用處?
? ? ? ?在OOP程序設(shè)計(jì)中句伶,當(dāng)我們定義一個class的時(shí)候蚂且,可以從某個現(xiàn)有的class繼承,新的class稱為子類(Subclass)毛俏,而被繼承的class稱為基類炭庙、父類或超類(Base class、Super class)煌寇。
比如焕蹄,我們已經(jīng)編寫了一個名為Animal的class,有一個run()方法可以直接打臃堋:
class Animal(object):
? ? ? ?def run(self):
? ? ? ? ? ? ?print 'Animal is running...'
當(dāng)我們需要編寫Dog和Cat類時(shí)腻脏,就可以直接從Animal類繼承:
class Dog(Animal):
? ? ?pass
class Cat(Animal):
? ? ?pass
對于Dog來說,Animal就是它的父類银锻,對于Animal來說永品,Dog就是它的子類。Cat和Dog類似徒仓。
繼承有什么好處腐碱?
? ? ? ?最大的好處是子類獲得了父類的全部功能誊垢。由于Animial實(shí)現(xiàn)了run()方法掉弛,因此,Dog和Cat作為它的子類喂走,什么事也沒干殃饿,就自動擁有了run()方法:
dog = Dog()
dog.run()
cat = Cat()
cat.run()
運(yùn)行結(jié)果如下:
Animal is running...
Animal is running...
當(dāng)然,也可以對子類增加一些方法芋肠,比如Dog類:
class Dog(Animal):
? ? ? ?def run(self):
? ? ? ? ? ? ? ?print 'Dog is running...'
? ? ? ?def eat(self):
? ? ? ? ? ? ? ?print 'Eating meat...'
繼承的第二個好處需要我們對代碼做一點(diǎn)改進(jìn)乎芳。你看到了,無論是Dog還是Cat帖池,它們r(jià)un()的時(shí)候奈惑,顯示的都是Animal is running...,符合邏輯的做法是分別顯示Dog is running...和Cat is running...睡汹,因此肴甸,對Dog和Cat類改進(jìn)如下:
class Dog(Animal):
? ? ? ?def run(self):
? ? ? ? ? ? ?print 'Dog is running...'
class Cat(Animal):
? ? ? def run(self):
? ? ? ? ? ? print 'Cat is running...'
再次運(yùn)行,結(jié)果如下:
Dog is running...
Cat is running...
當(dāng)子類和父類都存在相同的run()方法時(shí)囚巴,我們說原在,子類的run()覆蓋了父類的run()友扰,在代碼運(yùn)行的時(shí)候,總是會調(diào)用子類的run()庶柿。這樣村怪,我們就獲得了繼承的另一個好處:多態(tài)。
2.繼承的意義是什么
繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)的三大特征(封裝浮庐、繼承和多態(tài))之一甚负,不具有繼承功能的語言不能稱之為面向?qū)ο蟪绦蛟O(shè)計(jì)語言(如VB),繼承具有如下特點(diǎn):繼承劃分了類的層次性兔辅,父類代表的是更一般腊敲、更泛化的類,而子類則是更為具體维苔、更為細(xì)化碰辅;繼承是實(shí)現(xiàn)代碼重用、擴(kuò)展軟件功能的重要手段介时,子類中與父類完全相同的屬性和方法不必重寫没宾,只需寫出新增或改寫的內(nèi)容,這就是說子類可以復(fù)用父類的內(nèi)容沸柔,不必一切從零開始循衰。java只支持單一繼承,多重繼承要利用接口來實(shí)現(xiàn)褐澎。而Python支持多繼承会钝。