解析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”关键字作为前缀用来访问超类中声明的方法,属性和下标。


方法和属性覆盖 方法覆盖
继承实例和类型的方法可以通过 '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',程序将不允许再创建子类,否则它会引发错误。

(0)

相关推荐

  • 详解Swift编程中下标的用法

    访问一个集合的元素成员,在类中的序列和列表,结构和枚举都可以使用下标.这些下标用于存储和使用索引来检索值.数组元素可使用如:someArray[index],在 Dictionary 实例及其后续成员元素的访问也可以使用如:someDicitonary[key]. 对于单一类型,下标范围可以从单一到多个声明.我们可以用适当的下标重载传递给下标索引值的类型.下标也可以根据输入数据类型声明范围从单一维度到多维度. 下标声明语法和用法 让我们回顾一下计算属性.下标也遵循计算属性相同的语法.对于查询类型

  • Swift中用到extension的一些基本的扩展功能讲解

    现有的类,结构或枚举类型的功能可以在扩展的帮助下加入.类型的功能可以使用扩展加入,但重写的功能不能使用扩展. Swift 扩展功能: 添加计算属性并计算类型属性 定义实例和类型的方法 提供了新的初始化 定义下标 定义和使用新的嵌套类型 使现有类型符合协议 扩展用关键字 extension 声明 语法 复制代码 代码如下: extension SomeType {    // new functionality can be added here } 现有类型也可以用扩展加入使它作为一个协议标准和

  • 简单了解Swift语言中的break和continue语句的用法

    break语句 在 C 编程语言中的 break 语句有以下两种用法: 当在循环中遇到 break 语句, 循环立即终止,程序控制继续循环语句的后面(退出循环). 它可用于终止在switch语句(在下一章节)的情况(case). 如果使用嵌套循环(即,一个循环在另一个循环), break语句将停止最内层循环的执行,并开始执行下一行代码块之后的代码块. 语法 在Swift 编程中的 break语句的语法如下: 复制代码 代码如下: break 流程图 实例 复制代码 代码如下: import Co

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

    取大于形态的能力被定义为继承.一般一个类可以从另一个类继承属性和方法.类可以进一步划分到子类和超类. 子类:当一个类从另一个类继承属性,方法和功能被称为子类 超类:类包含属性,方法和功能被其它类继承称为超类 Swift 中类包含父类和调用访问方法,属性,功能和重写方法.另外,属性观察者也用于添加属性和修改所存储的或计算的特性的方法. 基类 一个类如果不从其它类继承方法,属性或功能,那么它被称为"基类". 复制代码 代码如下: classStudDetails{var stname:St

  • 详解C#面相对象编程中的继承特性

    继承(加上封装和多态性)是面向对象的编程的三个主要特性(也称为"支柱")之一. 继承用于创建可重用.扩展和修改在其他类中定义的行为的新类.其成员被继承的类称为"基类",继承这些成员的类称为"派生类".派生类只能有一个直接基类.但是,继承是可传递的.如果 ClassB 派生出 ClassC,ClassA 派生出 ClassB,则 ClassC 会继承 ClassB 和 ClassA 中声明的成员. 注意 结构不支持继承,但可以实现接口. 从概念上来

  • 讲解C#面相对象编程中的类与对象的特性与概念

    类 "类"是一种构造,通过使用该构造,您可以将其他类型的变量.方法和事件组合在一起,从而创建自己的自定义类型.类就像一个蓝图,它定义类型的数据和行为.如果类没有声明为静态类,客户端代码就可以创建赋给变量的"对象"或"实例",从而使用该类.在对变量的所有引用都超出范围之前,该变量始终保持在内存中.所有引用都超出范围时,CLR 将标记该变量以供垃圾回收.如果类声明为静态类,则内存中只存在一个副本,并且客户端代码只能通过该类自身而不是"实例变

  • 举例讲解Python面相对象编程中对象的属性与类的方法

    python 对象的属性 进入正题,来看一个实例来了解python中类,对象中公有属性,私有属性及局部变量,全局变量的区别. root@10.1.6.200:~# cat object.py #!/usr/bin/env python #coding:utf8 class Dave(): var1 = "class atribute,public atrribute var1" #类属性,公有属性var1 __var2 = "class self atribute __var

  • 深入解析Swift语言编程中的可选链

    查询,调用属性,下标和方法上的一个可选可能 'nil' 的过程被定义为可选的链.可选链返回两个值 如果可选包含一个值,然后调用其相关属性,方法和下标返回值 如果可选包含一个"nil"值,所有的相关属性,方法和下标返回nil 由于多种查询方法,属性和下标故障组合在一起,以一种链将影响到整个链,并导致产生 'nil' 的值. 可选链作为一种替代强制解包裹 可选链与可选值后指定"?"调用一个属性,方法或下标当可选的值返回一些值. 程序用于可选链 '!' 复制代码 代码如下

  • 解析C++编程中的继承方面的运用

    C++继承与组合详解 我们知道,在一个类中可以用类对象作为数据成员,即子对象(详情请查看:C++有子对象的派生类的构造函数).实际上,对象成员的类型可以是本派生类的基类,也可以是另外一个已定义的类.在一个类中以另一个类的对象作为数据成员的,称为类的组合(composition). 例如,声明Professor(教授)类是Teacher(教师)类的派生类,另有一个类BirthDate(生日),包含year,month,day等数据成员.可以将教授生日的信息加入到Professor类的声明中.如:

  • 深入解析Swift语言中的协议

    协议为方法,属性和其他要求的功能提供了一个蓝本.它只是描述了方法或属性的骨架,而不是实现.方法和属性实现还可以通过定义类,函数和枚举完成.协议的一致性是指方法或属性满足协议的要求. 语法 协议也遵循类似类,结构和枚举的语法: 复制代码 代码如下: protocol SomeProtocol {     // protocol definition } 协议在类,结构或枚举类型命名声明.单个和多个协议的声明也是可以的.如果多个协议规定,它们必须用逗号分隔. 复制代码 代码如下: struct So

  • Python语言的面相对象编程方式初步学习

    词语练习 class:告诉python创造一个新的东西 object:两个意思:最基本的东西和任何实例化的东西. instance:创建一个类得到的东西. def:在类中创建一个函数. self:在类里面的函数中使用,是实例和object能访问的变量. inheritance:继承,一个类可以继承另一个类,像你和你的父母. composition:一个类可以包含另外一个类,就像汽车包含轮胎. attribute:一个属性类,通常包括变量. is-a:表示继承关系 has-a:包含关系 通过卡片记

  • 对Java的面对对象编程中对象和引用以及内部类的理解

    最近利用下班的时候看了看的think in java感觉再看 和第一次看大不一样 接下来说一下java中对象和引用的关系,以及内部类的概念. 1.java中一切都是对象  在java中是什么来操作者对象呢?答案是引用,这就好比C或者C++中的指针. 如果用拥有一个引用,那么此时你必须让其和一个对象关联在一起,否则这个引用并不会像你想象的那样任由你的控制,例如你创建了一个String的引用: String s ; 而此时并未与任何对象关联,如果此时你去做一些操作,如调用String的一些方法,肯定

  • JavaScript程序中实现继承特性的方式总结

    概述 JavaScript的所有对象,都有自己的继承链.也就是说,每个对象都继承另一个对象,该对象称为"原型"(prototype)对象.只有null除外,它没有自己的原型对象. 原型对象的重要性在于,如果A对象是B对象的原型,那么B对象可以拿到A对象的所有属性和方法.Object.getPrototypof方法用于获取当前对象的原型对象. var p = Object.getPrototypeOf(obj); 上面代码中,对象p就是对象obj的原型对象. Object.create方

随机推荐