美文网首页
Swift 继承

Swift 继承

作者: 小强七号 | 来源:发表于2019-07-19 10:05 被阅读0次

继承我们可以理解为一个类获取了另一个类的所有方法和属性。当一个类继承其他类时,继承类叫子类,被继承的类叫超类(或父类)。在Swift中,类可以调用和访问超类的方法、属性、下表脚本,并且可以重写它们。我们也可以为类中继承来的属性添加属性观察器。

基类

没有继承其他类的类叫做基类(Base Class)。
下面我们定义了基类 StudDetails,描述了学生(stname)及其各科成绩的分数(mark1、mark2、mark3):

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

let sds = StudDetails(stname:stname, mark1:mark1, mark2:mark2, mark3:mark3);

print(sds.stname)
print(sds.mark1)
print(sds.mark2)
print(sds.mark3)

以上程序执行输出结果为:

swift
98
89
76
子类

子类时指在一个已有的类的基础上创建一个新的类。为了指明某个类的超类,将超类名写在子类名的后面,用冒号 :分割,语法格式如下

class SomeClass: SomeSuperClass {
      ///类的定义
}

以下实例中我们定义了超类 StudDetails,然后用子类 Tom 继承它:

class StudDetails
{
    var mark1: Int;
    var mark2: Int;
    
    init(stm1:Int, results stm2:Int)
    {
        mark1 = stm1;
        mark2 = stm2;
    }
    
    func show()
    {
        print("Mark1:\(self.mark1), Mark2:\(self.mark2)")
    }
}

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

let tom = Tom()
tom.show()

以上程序执行输出结果为:

Mark1:93, Mark2:89
重写方法和属性
1.重写方法:

在我们子类中可以使用 override 关键字来重写超类的方法。
以下实例中我们重写了 show()方法:

class SuperClass {
    func show() {
      print("这是超类SuperClass")  
  }
}

class SubClass: SuperClass {
  override func show() {
      print("这是子类 SubClass")
  }
}

let supCla = SuperClass()
supCla.show()

let subCla = SubClass()
subCla.show()

以上程序执行输出的结果为:

这是超类 SuperClass
这是子类 SubClass
2.重写属性

你可以提供定制的getter或(setter)来重写任意继承来的属性,无论继承来的属性是存储型还是计算型的属性。子类并不知道继承来的属性是存储的还是计算型的,它只知道继承来的属性会有一个名字和类型。所以你在重写一个属性时,必须将他的名字和类型都写出来。

注意:

  • 如果你在重写属性中提供了 setter,那么你也一定要提供 getter
  • 如果你不想再重写版本中的 getter 里修改继承来的属性值。你可以直接通过super.someProperty来返回继承来的值,其中someProperty是你重写的属性的名字。

以下实例我们定义了超类 Circle 及 子类 Rectangle,在 Rectangele 类中重写属性 area:

class Circle {
    var radius = 12.5
    var area: String {
        return "矩形半径 \(radius) "
    }
}

// 继承超类 Circle
class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + " ,但现在被重写为 \(print)"
    }
}

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

输出的结果为:

Radius 矩形半径 25.0  ,但现在被重写为 3
3.重写属性观察器

你可以在属性重写中为一个继承来的属性添加属性观察器。这样一来,当继承来的属性值发生改变是,你就会检测到。
注意:你不可以为继承来的常量存储属性或继承来的只读计算型属性添加属性观察器。

class Circle {
    var radius = 12.5
    var area: String {
        return "矩形半径为 \(radius) "
    }
}

class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + " ,但现在被重写为 \(print)"
    }
}


let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("半径: \(rect.area)")

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


let sq = Square()
sq.radius = 100.0
print("半径: \(sq.area)")
半径: 矩形半径为 25.0  ,但现在被重写为 3
半径: 矩形半径为 100.0  ,但现在被重写为 21
4.防止重写

我们可以使用 final关键字防止他们被重写。
如果你重写了final方法,属性或下标脚本在编译时会报错。
你可以通过在关键字 class前添加 final 特性 (final class)来将整个标记为 final的,这样的类是不可以被继承的,否则会编译报错

final class Circle {
    final var radius = 12.5
    var area: String {
        return "矩形半径为 \(radius) "
    }
}
class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + " ,但现在被重写为 \(print)"
    }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("半径: \(rect.area)")

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

let sq = Square()
sq.radius = 100.0
print("半径: \(sq.area)")

由于以上实例使用了 final 关键字不允许重写,所以执行会报错:

error: var overrides a 'final' var
    override var area: String {
                 ^
note: overridden declaration is here
    var area: String {
        ^
error: var overrides a 'final' var
    override var radius: Double {
                 ^
note: overridden declaration is here
    final var radius = 12.5
              ^
error: inheritance from a final class 'Circle'
class Rectangle: Circle {
      ^

相关文章

  • OC Swift文件混编

    一.Swift 类可以继承 OC 类,OC 类不能继承 Swift 类。 二.Swift 和 OC 混编 三.两个...

  • oc 继承 swift 类

    oc 继承 swift 类 项目中使用 oc 继承 swift 类编译器报错: oc 继承前增加 objc_sub...

  • OC调用Swift

    OC调用Swift,Swift的类必须继承NSObject

  • Swift枚举高级用法(Enum)

    关于swift的枚举 一 swift对于枚举的扩展性(Enum) 枚举的继承(继承任何类和协议,目前除了swift...

  • 类继承

    继承是面向对象的重要特征之一。swift中的继承只能发生在类上,结构体和枚举不能继承。在swift中,一个类继承另...

  • Swift 5.x - 初始化(中文文档)

    引言 继续学习Swift文档,从上一章节:继承,我们学习了Swift继承相关的内容,如继承的作用、重写父类的方法和...

  • swift方法参数遵守多继承和遵守多个协议

    参数继承协议 OC中 id Swift 3 protocol Swift 4 A & B 文档

  • swift继承

    一个类可以继承另一个类的方法,属性和其它特性。当一个类继承其它类时,继承类叫子类,被继承类叫超类(或父类)。在 S...

  • Swift:继承

    中文文档 一个类可以继承另一个类的方法,属性和其它特性。当一个类继承其它类时,继承类叫子类,被继承类叫超类(或父类...

  • swift 继承

    继承 类可以从另一个类继承方法,属性和其他特性 当一个类继承自另一个类时,继承类为子类,它继承的类称为其超类 子类...

网友评论

      本文标题:Swift 继承

      本文链接:https://www.haomeiwen.com/subject/uawdlctx.html