学习Swift和iOS开发第11部分:继承

在这篇文章中,您将了解继承。 不,不是那种有钱的亲戚过世而留下大量现金,然后辞掉工作而逃到巴厘岛度过永久假期的那种。 我们在谈论遗传,就像在遗传学中继承特征或特征一样。

稍后我们将详细讨论这一点,但让我们先深入研究代码。

创建家长班

首先,如果尚未打开Xcode,请点击Create New Playground 。 为其命名,例如Inheritance ,然后单击Next
选择某个位置以保存此.playground文件,然后单击“ Create以保存它。
您应该会看到类似下面的屏幕。

删除左侧的所有样板代码,但根据需要保留import UIKit

真正的继承是什么?

在iOS开发中,继承是面向对象编程的一项功能,您已在上一篇有关类的文章中了解了此功能。 类可以从其他类继承特征,这使其非常有用。
考虑到有关家庭的一切。 在每个家庭中,都有父母和孩子。 父母具有某些特质,这些特质会传给孩子们。

例如,我的头发是棕色的,而我父亲的头发是棕色的。 我从他那里得到了这种特质。 我们两个人之间还有许多其他相同的特征,但是我在许多方面与父亲有所不同。
虽然我中的许多人都很相似,但我拥有某些技能和特质,与我父亲不同。

在Swift中,我们将创建一个类作为父类。 它将包含许多一般特征。 然后,我们将创建一个子类,该子类将从父类继承特征。

子类将具有与父类相同的特征,但我们可以添加仅子类独有的特殊特征。 但是,让我们开始构建父类。

建立家长课堂

虽然我们可以创建有关实际父母的课程,并使之成为基于代码的遗传学实验,但我们将做一些更酷的事情-考虑超级棒的汽车! 🚗🚕🚙

撰写家长班

在您的Playground窗口中,添加以下Vehicle类,并为所有车辆具有的共同点创建一些变量:

 车辆类别{ 
变速轮= 4
var make:字符串?
var模型:字符串?
var currentSpeed:Double = 0
}

每辆汽车都有4个轮子,这就是我们创建该变量的原因。 但是,为什么我们没有为汽车的品牌或型号赋予价值呢?
嗯,每辆车都有某种制造商和模型,因此我们实际上不需要在父类中指定这些属性。

添加一些功能

在我们的Vehicle类中,我们实际上可以创建所有汽车都可以执行的一些功能:

 车辆类别{ 
变速轮= 4
var make:字符串?
var模型:字符串?
var currentSpeed:Double = 0

func drive(speedIncrease:Double){
currentSpeed + = speedIncrease
}

func刹车(){
currentSpeed = 0
}
}

上面的函数可能不是实际执行汽车驾驶和制动的最佳方法,但是您可以理解–您可以将函数添加到父类中。

现在,让我们来看一下继承的作用-带有子类。

创建一个子班

我们将创建一个名为SportsCar的子类(或子类),该子类继承自Vehicle 。 这意味着它将继承Vehicle类中的所有属性和函数,除非我们更改它们。

编写儿童班

Vehicle类下添加以下代码:

 跑车类:车辆{ 

}

上面我们要做的是声明一个名为SportsCar的类,并使用冒号:标识我们要从另一个类(在本例中为Vehicle)继承。

如果您是视觉学习者,希望以下插图可以帮助您解释发生了什么:

就目前的班级而言,它是Vehicle类的克隆。 除非我们另行指示,否则一切将与Vehicle完全相同地实现。 这就是我们现在要做的!

在我们对SportsCar类执行任何操作之前,我们实际上需要返回并向Vehicle类添加一个初始化函数。

Vehicle 类中 添加初始化函数

Vehicle类中,添加以下init()函数:

 车辆类别{ 
变速轮= 4
var make:字符串?
var模型:字符串?
var currentSpeed:Double = 0

在里面() {

}

func drive(speedIncrease:Double){
currentSpeed + = speedIncrease * 2
}

func刹车(){
currentSpeed = 0
}
}

稍后,当我们想在SportsCar类中指定它们时,这将使我们能够访问Vehicle的属性。

现在,我们实际上可以通过重写SportsCar类中的init()函数来做到这一点。

Vehicle 替代功能

将以下代码添加到SportsCar

 跑车类:车辆{ 
覆盖init(){
super.init()
make =“莲花”
模型=“ Elise”
}
}

通过从Vehicle类重写init() ,我们可以更改在SportsCar类中的使用方式。
通过使用super.init()我们实际上是在Vehicle中调用函数的。
因此,我们能够初始化makemodel为其赋予组合值"Lotus Elise"

太好了,因此我们的花式裤子跑车现在有个名字,但我们还应该考虑它的驱动方式。

跑车的驾驶方式不同于小型货车,对吗? 因此,我们也应该重写drive(speedIncrease:)函数。 在SportsCar类中尝试以下操作:

 跑车类:车辆{ 
覆盖init(){
super.init()
make =“莲花”
模型=“ Elise”
}

覆盖功能驱动器(speedIncrease:Double){
currentSpeed + = speedIncrease * 4
}
}

我们重写了函数drive(speedIncrease:)以使currentSpeed增加的量快得多,因为跑车的行驶速度应比普通车快。

创建同级类

如果继续以类为类的示例为例,则从父类创建另一个类会导致另一个子类,并且实际上我们可以将其称为与其他子类相关的同级类。

让我们为另一种类型的汽车-小型货车创建一个子类。 我可以肯定的是,没有孩子的孩子,看到这个词就感到颤抖-面包车。 对于那个很抱歉。

这辆小型货车除了是美国经典家庭的标志之外,它与跑车有很大的不同,因此,它需要在课堂上提供不同的信息。 让我们做吧。

写另一个儿童班

在您的Playground中,添加一个Minivan类,该类继承自SportsCar类下面的Vehicle

 小型货车:车辆{ 
  } 

这是我们为所有阅读此内容的视觉学习者所做的工作:

父类的替代函数

如果要添加自定义品牌和型号值,则需要像之前一样覆盖Vehicleinit()函数。 将以下代码添加到Minivan

 小型货车:车辆{ 
覆盖init(){
super.init()
make =“雪佛兰”
型号=“太空人”
}
}

现在,我们已经初始化了变量makemodel并为它们指定了Chevrolet Astro的值(啊,童年)。

现在,我们应该做的是重写drive(speedIncrease:)函数,以更改小型货车的驾驶方式。 任何曾经开过面包车或被开面包车的人都知道,它们并不是世界上最快的车辆,尤其是载满所有孩子的时候。

Minivan类内,重写drive(speedIncrease:)如下:

 小型货车:车辆{ 
覆盖init(){
super.init()
make =“雪佛兰”
型号=“太空人”
}

覆盖功能驱动器(speedIncrease:Double){
currentSpeed + = speedIncrease
}
}

包起来

为什么这么重要? 它使我们可以划分代码并对其进行修改以满足特定需求。

最后,这是来自Instagram的真实示例。
为了创建其过滤器,Instagram可能使用了包括通用过滤器的父类。 但是,每个单独的滤镜(例如Valencia,Inkwell,Nashville等)都可以做成一个子类,其中包含用于以某种方式过滤照片的独特算法。

与其将所有过滤器都放在一个巨大的类中,不如将子类用于建立更具可读性和紧凑性的代码库。

继承是面向对象编程的基本原理,对于要成为一名专业的程序员,了解这一点非常重要。
请记住,这篇文章并不详尽。 在线上有无尽的资源可以帮助您理解这一点。 永远不要停止学习和寻求理解。

在下一课中,我们将学习Swift多态性。