无涯教程-Swift - 继承

84 阅读4分钟

通常,一个类可以从另一个类继承方法,属性和函数。类可以进一步分类为子类和父类。

  • 子类    -  当一个类从另一个类继承属性,方法和函数时,称为子类

  • 父类    -  包含从其自身继承其他类的属性,方法和函数的类称为超类

Swift 4类包含调用和访问方法,属性,函数和覆盖方法的父类,此外,属性观察器还用于添加属性并修改存储或计算的属性方法。

基类

不继承另一个类的方法,属性或函数的类称为“Base Class”。

class StudDetails {
   var stname: String!
   var mark1: Int!
   var mark2: Int!
   var mark3: Int!

init(stname: String, mark1: Int, mark2: Int, mark3: Int) { self.stname=stname self.mark1=mark1 self.mark2=mark2 self.mark3=mark3 } }

let stname="Swift 4" let mark1=98 let mark2=89 let mark3=76

print(stname) print(mark1) print(mark2) print(mark3)

运行上述程序时,我们得到以下输出-

Swift 4
98
89
76

此处将具有类名StudDetails的类定义为基类,该基类用于包含学生名称以及三个科目标签为mark1,mark2和mark3。 " let"关键字用于初始化基类的值,并借助"print"函数显示基类的值。

子类

将新类基于现有类的行为被定义为“subclass”。子类继承其基类的属性,方法和函数,要在基类名称之前使用子类“:”

class StudDetails {
   var mark1: Int;
   var mark2: Int;

init(stm1:Int, results stm2:Int) { mark1=stm1; mark2=stm2; } func print() { print("Mark1:(mark1), Mark2:(mark2)") } }

class display : StudDetails { init() { super.init(stm1: 93, results: 89) } }

let marksobtained=display() marksobtained.print()

运行上述程序时,我们得到以下输出-

Mark1:93, Mark2:89

" StudDetails"类定义为超类,其中声明了学生标签,子类" display"用于从其超类继承标签,子类定义学生标签并调用print()方法以显示学生标签。

覆盖

 override关键字用于覆盖超类中声明的方法。

超类,属性和下标

" super"关键字用作访问超类中声明的方法,属性和下标的前缀

Overriding 访问 methods,properties and subscripts
Methods super.somemethod()
Properties super.someProperty()
Subscripts super[someIndex]

方法覆盖

可以通过子类中定义的方法的override关键字来覆盖继承的和类型方法,在这里,print()在子类中被重写,以访问超类print()中提到的type属性。 cricket()超类的新也被创建为" cricinstance"。

class cricket {
   func print() {
      print("Welcome to Swift 4 Super Class")
   }
}

class tennis: cricket { override func print() { print("Welcome to Swift 4 Sub Class") } }

let cricinstance=cricket() cricinstance.print()

let tennisinstance=tennis() tennisinstance.print()

运行上述程序时,我们得到以下输出-

Welcome to Swift Super Class
Welcome to Swift Sub Class

属性覆盖

您可以覆盖继承的或类属性,以为该属性提供自己的自定义getter和setter。

覆盖Getters 和 Setters 属性

Swift 4允许用户提供自定义的getter和setter来覆盖继承的属性,无论它是存储属性还是计算属性。子类不知道继承的属性名称和类型。因此,用户需要在子类中指定在超类中指定的覆盖属性的名称和类型是至关重要的。

class Circle {
   var radius=12.5
   var area: String {
      return "of rectangle for\(radius) "
   }
}

class Rectangle: Circle { var print=7 override var area: String { return super.area + " is now overridden as(print)" } }

let rect=Rectangle() rect.radius=25.0 rect.print=3 print("Radius(rect.area)")

运行上述程序时,我们得到以下输出-

Radius of rectangle for 25.0  is now overridden as 3

覆盖观察者属性

当需要为继承的属性添加新属性时,在Swift 4中会引入"property overriding"概念。

class Circle {
   var radius=12.5
   var area: String {
     return "of rectangle for\(radius) "
   }
}

class Rectangle: Circle { var print=7 override var area: String { return super.area + " is now overridden as(print)" } }

let rect=Rectangle() rect.radius=25.0 rect.print=3 print("Radius(rect.area)")

class Square: Rectangle { override var radius: Double { didSet { print=Int(radius/5.0)+1 } } }

let sq=Square() sq.radius=100.0 print("Radius(sq.area)")

运行上述程序时,我们得到以下输出-

Radius of rectangle for 25.0  is now overridden as 3
Radius of rectangle for 100.0  is now overridden as 21

Final防止覆盖

当用户不需要其他人访问超类方法,属性或下标时,Swift 4会引入"final"属性来防止覆盖。声明"final"属性后,下标将不允许超类方法,属性及其下标被覆盖。声明" final"属性后,将限制用户创建其他子类。

final class Circle {
   final var radius=12.5
   var area: String {
      return "of rectangle for\(radius) "
   }
}

class Rectangle: Circle { var print=7 override var area: String { return super.area + " is now overridden as(print)" } }

let rect=Rectangle() rect.radius=25.0 rect.print=3 print("Radius(rect.area)")

class Square: Rectangle { override var radius: Double { didSet { print=Int(radius/5.0)+1 } } }

let sq=Square() sq.radius=100.0 print("Radius(sq.area)")

运行上述程序时,我们得到以下输出-

<stdin>:14:18: error: var overrides a final var
override var area: String {
^
<stdin>:7:9: note: overridden declaration is here
var area: String {
^
<stdin>:12:11: error: inheritance from a final class Circle
class Rectangle: Circle {
^
<stdin>:25:14: error: var overrides a final var
override var radius: Double {
^
<stdin>:6:14: note: overridden declaration is here
final var radius=12.5

由于超类被声明为"final",并且其数据类型也被声明为"final",因此该程序将不允许进一步创建子类,并且会引发错误。

参考链接

www.learnfk.com/swift/swift…