学习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
中调用函数的。
因此,我们能够初始化make
和model
为其赋予组合值"Lotus Elise"
。
太好了,因此我们的花式裤子跑车现在有个名字,但我们还应该考虑它的驱动方式。
跑车的驾驶方式不同于小型货车,对吗? 因此,我们也应该重写drive(speedIncrease:)
函数。 在SportsCar
类中尝试以下操作:
跑车类:车辆{
覆盖init(){
super.init()
make =“莲花”
模型=“ Elise”
}
覆盖功能驱动器(speedIncrease:Double){
currentSpeed + = speedIncrease * 4
}
}
我们重写了函数drive(speedIncrease:)
以使currentSpeed
增加的量快得多,因为跑车的行驶速度应比普通车快。
创建同级类
如果继续以类为类的示例为例,则从父类创建另一个类会导致另一个子类,并且实际上我们可以将其称为与其他子类相关的同级类。
让我们为另一种类型的汽车-小型货车创建一个子类。 我可以肯定的是,没有孩子的孩子,看到这个词就感到颤抖-面包车。 对于那个很抱歉。
这辆小型货车除了是美国经典家庭的标志之外,它与跑车有很大的不同,因此,它需要在课堂上提供不同的信息。 让我们做吧。
写另一个儿童班
在您的Playground中,添加一个Minivan
类,该类继承自SportsCar
类下面的Vehicle
:
…
小型货车:车辆{
}
这是我们为所有阅读此内容的视觉学习者所做的工作:
父类的替代函数
如果要添加自定义品牌和型号值,则需要像之前一样覆盖Vehicle
的init()
函数。 将以下代码添加到Minivan
:
小型货车:车辆{
覆盖init(){
super.init()
make =“雪佛兰”
型号=“太空人”
}
}
现在,我们已经初始化了变量make
和model
并为它们指定了Chevrolet Astro的值(啊,童年)。
现在,我们应该做的是重写drive(speedIncrease:)
函数,以更改小型货车的驾驶方式。 任何曾经开过面包车或被开面包车的人都知道,它们并不是世界上最快的车辆,尤其是载满所有孩子的时候。
在Minivan
类内,重写drive(speedIncrease:)
如下:
小型货车:车辆{
覆盖init(){
super.init()
make =“雪佛兰”
型号=“太空人”
}
覆盖功能驱动器(speedIncrease:Double){
currentSpeed + = speedIncrease
}
}
包起来
为什么这么重要? 它使我们可以划分代码并对其进行修改以满足特定需求。
最后,这是来自Instagram的真实示例。
为了创建其过滤器,Instagram可能使用了包括通用过滤器的父类。 但是,每个单独的滤镜(例如Valencia,Inkwell,Nashville等)都可以做成一个子类,其中包含用于以某种方式过滤照片的独特算法。
与其将所有过滤器都放在一个巨大的类中,不如将子类用于建立更具可读性和紧凑性的代码库。
继承是面向对象编程的基本原理,对于要成为一名专业的程序员,了解这一点非常重要。
请记住,这篇文章并不详尽。 在线上有无尽的资源可以帮助您理解这一点。 永远不要停止学习和寻求理解。
在下一课中,我们将学习Swift多态性。