一個類可以繼承另一個類的方法、屬性和其它特性。當一個類繼承其它類時,繼承類叫子類(subclass),被繼承類叫超類(或父類,superclass)。在 Swift 中,繼承是區分「類」與其它類型的一個基本特征。
在 Swift 中,類可以調用和通路超類的方法、屬性和下标,并且可以重寫(override)這些方法、屬性和下标來優化或修改它們的行為。
1.定義一個基類:不繼承于其它類的類,稱之為基類
- Swift 中的類并不是從一個通用的基類繼承而來。如果你不為你定義的類指定一個超類的話,這個類就自動成為基類。這點和OC不同,OC中有一個超類NSObject。
class SomeSuperclass
{
//這裡是基類的定義
}
2.子類生成:為了指明某個類的超類,将超類名寫在子類名的後面,用冒号分隔
- 子類生成指的是在一個已有類的基礎上建立一個新的類。子類繼承超類的特性,并且可以進一步完善。
class SomeClass: SomeSuperclass
{
//這裡是子類的定義
}
3.重寫:如果要重寫某個特性,必須在重寫定義的前面加上override關鍵字。
- 子類可以為繼承來的執行個體方法、類方法、執行個體屬性、或下标提供自己定制的實作。
【說明】:在合适的地方,可以通過使用
super
字首來通路超類版本的方法,屬性或下标:
- 在方法
的重寫實作中,可以通過someMethod()
來調用超類版本的super.someMethod()
方法。someMethod()
- 在屬性
的 getter 或 setter 的重寫實作中,可以通過someProperty
來通路超類版本的super.someProperty
屬性。someProperty
- 在下标的重寫實作中,可以通過
來通路超類版本中的相同下标。super[someIndex]
class SuperClass
{
var iTemp = 0;
func temp()
{
print("SuperClass");
}
//使用關鍵字class的類方法可以被重寫
class func testCanOverride()
{
print("SuperClass testCanOverride");
}
//使用關鍵字static的類方法不可以被重寫
static func testCanNotOverride()
{
print("SuperClass testCanNotOverride");
}
}
class ChildrenClass: SuperClass
{
// override var iTemp = 3; //錯誤:子類重寫必須為計算屬性
override var iTemp: Int
{
get {
return 3;
}
set {
self.iTemp = newValue;
}
}
override func temp()
{
print("ChildrenClass");
}
override class func testCanOverride()
{
super.testCanOverride(); //先列印父類的對應方法
print("ChildrenClass testCanOverride");
}
}
ChildrenClass.testCanOverride();
【注意】:
- 類方法是使用關鍵字class修飾的方法(子類可以重寫),也可以使用static修飾(子類不可以重寫),這時子類就不能重寫。static相當于class+final的作用
- 子類可以将父類的存儲屬性和計算屬性進行重寫,子類重寫必須為計算屬性(提供getter和setter)
- 子類可以将隻讀屬性重寫為可讀寫的(提供getter和setter),但是不能将父類的讀寫屬性重寫為隻讀屬性(隻提供getter)
- 不能對一個父類let修飾的存儲屬性在子類中進行重寫。因為常量在定義時就被指派。
4.防止重寫
- 可以通過把方法,屬性或下标标記為final來防止它們被重寫,隻需要在聲明關鍵字前加上final修飾符即可(例如:final var,final func,final class func,以及final subscript);
- 在關鍵字class前添加final修飾符(final class)來将整個類标記為 final 的。這樣的類是不可被繼承的,試圖繼承這樣的類會導緻編譯報錯
無善無惡心之體,
有善有惡意之動,
知善知惡是良知,
為善去惡是格物。