十二、继承 Inheritance

1. 概述

子类可以访问父类的方法,属性和小标脚本。并且可以覆盖父类的版本,实现自己的版本。

同样, 也可以在子类中给父类的属性(stored or computed)提供属性监视器。

2. 定义一个基类 Defining a Base Class

不是从任何类继承而来的来,称为基类。

如下,定义一个汽车的基类:

    class Vehicle {
      var currentSpeed = 0.0
      var description: String {//只读属性
        return "traveling at \(currentSpeed) miles per hour"
      }
      func makeNoise() {
        // do nothing - an arbitrary vehicle doesn‘t necessarily make a noise
      }
    }

3. 子类 Subclassing

定义一个自行车类

    class Bicycle: Vehicle {
        var hasBasket = false
    }

4. 重载(覆盖) Overriding

使用override关键字在子类中覆盖父类的版本

5. 访问父类的方法、属性和小标脚本 Accessing Superclass Methods, Properties, and Subscripts

子类定义了自己的版本,覆盖父类的版本时,有时需要访问父类的版本,此时使用super关键字访问父类版本,如:

super.someMethod()

super.someProperty

super[someIndex]

6. 覆盖方法 Overriding Methods

如,定义火车类:

    class Train: Vehicle {
      override func makeNoise() {
        println("Choo Choo")
      }
    }
    let train = Train()
    train.makeNoise() // prints "Choo Choo"

7. 覆盖属性 Overriding Properties

7.1 覆盖get方法和set方法 Overriding Property Getters and Setters

你可以在子类中给父类的任何属性提供get方法和set方法。

在父类中为 read-only 属性,在子类中你可以给它同时提供 get 和 set 方法,使它在子类中为 read-write 属性。

反之不行,你不能将父类中 read-write 属性,在子类中覆盖为 read-only 。

如,car 类:

    class Car: Vehicle {
      var gear = 1
      override var description: String {
        return super.description + " in gear \(gear)"
      }
    }
    let car = Car()
    car.currentSpeed = 25.0
    car.gear = 3
    println("Car: \(car.description)")
    // Car: traveling at 25.0 miles per hour in gear 3

7.2 覆盖属性监视器 Overriding Property Observers

你可以给任何继承来的属性添加属性监视器,除开以下情况:

1)你不能在子类中给 inherited constant stored properties 和 inherited read-only computed properties 添加属性监视器,因为他们不可改变。

2)你不能再子类中同时提供覆盖的(重载的)set 方法和覆盖的(重载的)属性监视器,因为你可以在set方法中对属性值的变化作出反应。

    class AutomaticCar: Car {
      override var currentSpeed: Double {
        didSet {
          gear = Int(currentSpeed / 10.0) + 1
        }
      }
    }
    let automatic = AutomaticCar()
    automatic.currentSpeed = 35.0
    println("AutomaticCar: \(automatic.description)") // AutomaticCar: traveling at 35.0 miles per hour in gear 4

8. 阻止覆盖Preventing Overrides

你可以通过final关键字让某个类中属性、方法和小标脚本无法被子类覆盖,如

final var

final func

final class func

final subscript

final class //这个类不能被任何类继承

参考:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html#//apple_ref/doc/uid/TP40014097-CH17-ID193

时间: 2024-11-18 14:10:06

十二、继承 Inheritance的相关文章

Java 第十二章 继承 笔记

Java 第十二章  继承 笔记 一.使用继承:     1)方便修改代码     2)减少代码量 二.super 继承object 类:super 访问父类的无参构造:super 指的是object 的无参构造.     例:子类调用父类:super.属性 / super.方法    注意:子类不能继承父类私有属性:得用set.get方法来调用:    super只能写在代码块的第一句:super只能调用非私有的方法:    super只能出现在子类的方法和构造方法中. 三.不能被继承的父类成

C++语言笔记系列之十二——C++的继承

C++的继承 1.继承方式 public(公有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象只能访问基类的public成员. protected(保护继承),private(私有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象不能访问基类的任何成员. 2.例子 example 1: #include <iostream.h> clas

第十二章 继承

第十二章 继承 1.  什么是继承和派生? 继承: 派生: 2.  复杂的继承和派生. 3.  继承和派生如何在C++中实现. 4.  单一继承. 在实际应用中可以将 基类和派生类视为一个整体 5.  保护成员. 封装的含义: 为了解决这个问题我们引进了protected. 6.  公有派生的公有成员. 子类可以直接调用 7.  公有派生的保护成员. 子类可以通过自己间接访问 8.  公有派生的私有成员. 子类只能通过父类间接访问 在派生类中对基类成员的访问限定 其中public protect

十二周(摩托车继承自行车和机动车)

/* *copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:十二周(摩托车继承自行车和机动车) *作者:王忠 *完成日期:2015.5.27 *版本号:v1.0 * *问题描述: *输入描述: *程序输出: #include <iostream> #include<conio.h> #include <windows.h> using namespace std; enum vehicleStaus {rest

第十二周项目3-摩托车继承自行车和电动车

#include <iostream> #include<conio.h> #include <windows.h> using namespace std; enum vehicleStaus {rest, running}; //车辆状态:泊车.行进 class vehicle //车辆类,虚基类 { protected: int maxSpeed; //最大车速 int currentSpeed; //当前速度 int weight; //车重 vehicleSt

C++语言学习(十)——继承与派生

C++语言学习(十)--继承与派生 一.类之间的关系 1.类之间的组合关系 组合关系是整体与部分的关系.组合关系的特点:A.将其它类的对象作为当前类的成员使用B.当前类的对象与成员对象的生命周期相同C.成员对象在用法上与普通对象相同Computer类由其它多个部件类组合而成,当Computer销毁时,其它部件对象同时销毁. #include <iostream> using namespace std; class Memory { public: Memory() { cout <&l

QT开发(二十二)——QMainWindow主窗口

QT开发(二十二)--QMainWindow主窗口 一.主窗口简介 应用程序中的主窗口是与用户进行长时间交互的顶层窗口,提供了应用程序的大部分功能,通常是应用程序启动后的第一个窗口,应用程序一般由一个主窗口和多个对话框组成. QT中直接支持主窗口,QMainWindow是QT中主窗口的基类,是继承于QWidget类的容器型组件. QMainWindow内部封装了菜单栏.工具栏.中心组件.停靠组件.状态栏等. QMainWindow内置了布局管理器,基本的组件布局如下: 二.菜单栏 QT中提供了预

Python开发【第二十二篇】:Web框架之Django【进阶】

Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 新随笔 联系 订阅 管理 随笔-124  文章-127  评论-205 Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻

QT开发(五十二)———QML语言

QT开发(五十二)---QML语言 QML是一种声明语言,用于描述程序界面.QML将用户界面分解成一块块小的元素,每一元素都由很多组件构成.QML定义了用户界面元素的外观和行为:更复杂的逻辑则可以结合JavaScript脚本实现. 一.QML基础语法 1.Import语句 QML代码中,import语句一般写在头几行,主要用途如下:     A.包含类型的全名空间     B.包含QML代码文件的目录     C.JavaScript代码文件 格式如下: import Namespace Ver

【《Objective-C基础教程 》笔记ch04】(五)OC中的继承inheritance机制

一.为什么需要继承 使用继承一方面继承了父类的特性,另一方便解决了重复代码维护问题. 二.继承之语法 1. @interface 子类名:父类名 2. OC只支持单继承,不支持继承多个父类. 3. 重构--移植和优化代码. 三. 继承的工作机制 1. 方法调度 子类拥有一个指向它父类的引用指针,消息传递时,OC的方法调度机制使用该信息来找到正确的实现方法,查找过程是现在子类中找,找不到再到父类中继续找. 2. 实例变量 1)继承实例源码 @interface Shape : NSObject {