解析Swift语言面相对象编程中的继承特性

 更新时间:2015年11月05日 15:09:06   投稿:goldensun  
这篇文章主要介绍了解析Swift语言面相对象编程中的继承特性,是Swift入门学习中的基础知识,需要的朋友可以参考下

取大于形态的能力被定义为继承。一般一个类可以从另一个类继承属性和方法。类可以进一步划分到子类和超类。

子类:当一个类从另一个类继承属性,方法和功能被称为子类

超类:类包含属性,方法和功能被其它类继承称为超类

Swift 中类包含父类和调用访问方法,属性,功能和重写方法。另外,属性观察者也用于添加属性和修改所存储的或计算的特性的方法。

基类
一个类如果不从其它类继承方法,属性或功能,那么它被称为“基类”。

复制代码 代码如下:

classStudDetails{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"let mark1 =98let mark2 =89let mark3 =76

println(stname)
println(mark1)
println(mark2)
println(mark3)


当我们使用 playground 运行上面的程序,得到以下结果。

swift
98
89
76

这里 StudDetails 类被定义为基类,它用于包含学生名字和三个科目标记为:mark1, mark2 和 mark3. 'let'关键字在 playground 中初始化并使用 “println” 函数打印显示基础类的值。

子类
在现有的基类上定义一个新的类就叫作“子类”。子类继承了其基类的属性,方法和功能。要定义一个子类使用 “ : ” 在基类名称前。

复制代码 代码如下:

classStudDetails{var mark1:Int;var mark2:Int;
   
    init(stm1:Int, results stm2:Int){
        mark1 = stm1;
        mark2 = stm2;}
   
    func print(){
        println("Mark1:\(mark1), Mark2:\(mark2)")}}class display :StudDetails{
    init(){super.init(stm1:93, results:89)}}let marksobtained = display()
marksobtained.print()


当我们使用 playground 运行上面的程序,得到以下结果。

Mark1:93, Mark2:89

“StudDetails” 类定义为学生标记声明的超类以及子类的 'display' 从它的超类继承以打的标记。子类定义学生标记和调用打印方法来显示学生的标志。

覆盖/重写
访问超类的实例,类型方法,例如,类型属性和下标子类提供覆盖的概念。 'override' 关键字用来覆盖超类中声明的方法。

访问超级类的方法,属性和下标
“super”关键字作为前缀用来访问超类中声明的方法,属性和下标。

2015115151431204.png (244×140)
方法和属性覆盖 方法覆盖
继承实例和类型的方法可以通过 'override' 关键字覆盖在子类中定义的方法。在这里,在子类中重写打印来访问超类打印type属性。

复制代码 代码如下:

class cricket {
    func print(){
        println("Welcome to Swift Super Class")}}class tennis: cricket  {override func print(){
        println("Welcome to Swift Sub Class")}}let cricinstance = cricket()
cricinstance.print()let tennisinstance = tennis()
tennisinstance.print()


当我们使用 playground 运行上面的程序,得到以下结果。

Welcome to Swift Super Class
Welcome to Swift Sub Class

属性重写
可以覆盖继承的实例或类属性来提供自定义的getter和setter 属性,或添加属性观察者,当下层属性值更改时以使重写属性到观察者。

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

这可以通过两种方式来完成:

当 setter 被定义为重写属性,用户必须也要定义 getter。

当我们不希望修改继承属性的getter,我们可以通过简单的语法“super.someProperty”来给超类继承值。

复制代码 代码如下:

classCircle{var radius =12.5var area:String{return"of rectangle for \(radius) "}}classRectangle:Circle{varprint=7overridevar area:String{returnsuper.area +" is now overridden as \(print)"}}let rect =Rectangle()
rect.radius =25.0
rect.print=3
println("Radius \(rect.area)")


当我们使用 playground 运行上面的程序,得到以下结果。

Radius of rectangle for 25.0 is now overridden as 3

重写属性观察者
当一个新的属性需要为继承的属性被添加,在 Swift 中推出 “属性重写” 的概念。通知用户当继承属性值被更改。但重写不适用于继承的常量存储属性和继承只读计算属性。

复制代码 代码如下:

classCircle{var radius =12.5var area:String{return"of rectangle for \(radius) "}}classRectangle:Circle{varprint=7overridevar area:String{returnsuper.area +" is now overridden as \(print)"}}let rect =Rectangle()
rect.radius =25.0
rect.print=3
println("Radius \(rect.area)")classSquare:Rectangle{overridevar radius:Double{
        didSet {print=Int(radius/5.0)+1}}}let sq =Square()
sq.radius =100.0
println("Radius \(sq.area)")


当我们使用 playground 运行上面的程序,得到以下结果。

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

最终属性以防止重写
当用户不需要让别人访问超类的方法,属性或下标,Swift 引入“final”属性,以防止覆盖。 当 “final” 属性被声明后,将不允许超类的方法,属性和下标被覆盖。在超类不可以有 'final' 。当 “final” 属性被声明后,用户限制子类创建。

复制代码 代码如下:

 finalclassCircle{finalvar radius =12.5var area:String{return"of rectangle for \(radius) "}}classRectangle:Circle{varprint=7overridevar area:String{returnsuper.area +" is now overridden as \(print)"}}let rect =Rectangle()
rect.radius =25.0
rect.print=3
println("Radius \(rect.area)")classSquare:Rectangle{overridevar radius:Double{
        didSet {print=Int(radius/5.0)+1}}}let sq =Square()
sq.radius =100.0
println("Radius \(sq.area)")


当我们使用 playground 运行上面的程序,得到以下结果。

复制代码 代码如下:

<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',程序将不允许再创建子类,否则它会引发错误。

相关文章

  • Swift中的Access Control权限控制介绍

    Swift中的Access Control权限控制介绍

    这篇文章主要介绍了Swift中的Access Control权限控制介绍,本文讲解了private、internal、public三个关键字的使用,需要的朋友可以参考下
    2015-05-05
  • Swift中的命名空间详解

    Swift中的命名空间详解

    这篇文章主要给大家介绍了关于Swift中命名空间的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Swift中初始化init的方法小结

    Swift中初始化init的方法小结

    Swift有着超级严格的初始化方法,不仅强化了designated初始化方法的地位,所有不加修饰的init方法都需要在方法中确保非Optional的实例变量被赋值初始化,下面这篇文章主要给大家介绍了关于Swift中初始化init的相关资料,需要的朋友可以参考下。
    2018-04-04
  • 分享十条实用的Swift小提示

    分享十条实用的Swift小提示

    是时候使用易入手又全面的Swif语言为iOS和mac OS X做应用开发了,下面这篇文章主要给大家分享介绍了十条实用的Swift小提示的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧
    2018-06-06
  • Swift初始化器与可选链的使用方法介绍

    Swift初始化器与可选链的使用方法介绍

    初始化器初始化是准备类、结构或枚举的实例以供使用的过程。此过程涉及为该实例上的每个存储属性设置初始值,并执行在新实例准备就绪可供使用之前所需的任何其他设置或初始化,可选链是一种可以请求和调用属性、方法和子脚本的过程,用于请求或调用的目标可能为nil
    2022-08-08
  • Swift中类与结构的初始化示例解析

    Swift中类与结构的初始化示例解析

    这篇文章主要为大家介绍了Swift中类与结构的初始化解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-03-03
  • iOS开发中Swift 指纹验证功能模块实例代码

    iOS开发中Swift 指纹验证功能模块实例代码

    本文给大家分享ios调用touchid代码块,非常不错,具有参考借鉴价值,需要的朋友参考下把
    2017-03-03
  • swiftui开发之padding默认值设置详解

    swiftui开发之padding默认值设置详解

    这篇文章主要为大家介绍了swiftui开发之padding默认值设置详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Swift 如何让ScrollView滚动到具体某个位置

    Swift 如何让ScrollView滚动到具体某个位置

    这篇文章主要介绍了Swift 如何让ScrollView滚动到具体某个位置,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • swift计步器CMPedometer的使用方法

    swift计步器CMPedometer的使用方法

    这篇文章主要为大家详细介绍了swift计步器CMPedometer的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09

最新评论