Jython的繼承能力:單繼承和多繼承
Jython的繼承
類繼承的能力是面向對象編程的基礎。Jython 支持單繼承和多繼承。單繼承 意味只有一個父類,多繼承 意味著可以有多個父類。
繼承是通過派生其他類實現的。這些類可以是其他 Jython 類,也可以是 Java 類。可以從任何數量的純 Jython 類或者 Java 實例派生,但是只能(直接或者間接)繼承一個 Java 類。不需要提供一個父類。
父類中的所有屬性或者方法都存在于所有子類中,并可以被類自身或者所有客戶使用(假定它是 publicly 變量)。在可以使用父類的實例的所有地方都可以使用子類的所有實例 ―― 下面是 多態 的一個例子。這些功能使重用、快速開發和容易擴展成為可能。
下面是一些繼承的例子:
- class Class1: pass # no inheritance
- class Class2: pass
- class Class3(Class1): pass # single inheritance
- class Class4(Class3,Class2): pass # multiple inheritance
- from java import awt
- from java import io
- # inherit a Java class and interface and a Jython class
- class MyPanel(awt.Panel, io.Serializable, Class2):
- :
Jython的繼承——將類作為值使用
還可以將類賦值給變量(包括函數參數)。這使編寫基于類的動態代碼相當容易,可以從下面的通用類實例工廠看到這一點:
- def instanceMaker(xclass, *args):
- return apply(xclass, args)
- :
- x = instanceMaker(MyClass) # same as: x = MyClass()
Jython的繼承——帶繼承的 init 方法
子類的 __init__ 方法必須調用其父類定義的所有 __init__ 方法,這不會自動進行。下面的兩個例子展示了如何使用帶繼承的 __init__ 方法。
- class Class1(SuperClass):
- def __init__ (self): # no arguments
- SuperClass.__init__(self) # init my super-class
- self.data = [] # set implicit data
- class Class2(SuperClass):
- def __init__ (self, v1, v2): # 2 required arguments
- SuperClass.__init__(self, v1) # init my super-class with v1
- self.v2 = v2
下面是一些帶多繼承的初始化的例子:
- class Class1(Super1, Super2):
- def __init__ (self): # no arguments
- Super1.__init__(self) # init each super-class
- Super2.__init__(self)
- self.data = [] # set implicit data
- class Class2(Super1, Super2):
- def __init__ (self, v1, v2, v3): # 3 required arguments
- # note you may do work before calling the super __init__ methods
- self.v3 = v3 # set data from parameter
- Super1.__init__(self, v1) # init each super-class
- Super2.__init__(self, v2)
Jython的繼承——調用父類方法
可以使用類名限定調用所有父類方法,如下所示:
- class Class1:
- def method1 (self):
- :
- class Class2(Class1):
- def method1 (self): # override method1
- :
- Class1.method1(self) # call my super-class method
- :
- def method2 (self):
- :
- class Class3(Class2):
- def method1 (self): # override method1
- :
- Class2.method1(self) # call my super-class method
- :
- def method3 (self):
- :
注意,次要的方法定義(在 Class2 和 Class3 中)覆蓋了父類定義。不要求子類方法調用其父類方法,不過,如果它不這樣做,那么它就必須完整地替換父類方法的函數。
Jython的繼承——調用方法
有兩種調用方法的語法(假定有一個由變量 mci 引用的 MyClass 實例):
- mci.someMethod(...)
- MyClass.someMethod(mci, ...)
***種形式通常用于類客戶編碼中,而第二種形式更常用于在子類中調用父類方法。
【編輯推薦】