Swift 之类的继承与类的访问权限
http://www.cocoachina.com/swift/20160104/14821.html
上一篇博客《窥探Swift之别具一格的Struct和Class》的博客可谓是给Swift中的类开了个头。关于类的内容还有很多,今天就来搞一下类中的继承以及类的访问权限。说到类的继承,接触过面向对象编程(OOP)的小伙伴并不陌生,继承就是OOP编程中几大特征之一,所以还是有必要把类的继承拎出来聊聊的。说到访问权限,这个在OOP编程中也是不可或缺的。如果你接触过其他OOP的语言,你应该对private, public, protected并不陌生。在Swift这么面向对象的编程语言中,也有类似的概念,不过其具体表达的方式以及每种权限的作用域不同罢了。在Swift中的访问权限有private, internal与public。他们的作用域与其他语言还是有些区别的,这个稍后会细细的道来。
今天的博客在类的内容中还是比较重要的,同时也是比较基础的东西,当然很有必要好好的搞一下喽。在介绍继承和访问权限时,在恰当的地方会类比一下Objc, 如果你没有接触过Objc, 那么没关系,你可以把类比的部分给忽略掉,这并不影响你对Swift相应内容的理解。好~开始今天博客的内容。
一. 类的继承
其实继承理解起来还是蛮简单的,说白了就是子承父业。子类可以继承父类的一些东西,在继承之时,父类可以选择一些东西留给子类,同时也可以保留一些东西作为私有(private)物品。同样,子类也可以选择一些东西进行继承,如果对继承的东西不太满意,子类就可以对继承过来的东西进行重新改造(override)以满足自己的需求。如果要定义抽象类,只需把该类的构造器定义为私有即可。下方将会给出类的继承的一些示例,通过这些事例来认识一下Swift中的继承。
1. 父类的创建
这里我们创建一个名为Father的父类,他类可以继承Father类。在Father类中有两个初始值为空串的属性变量,并且有一个含有默认值参数的构造器,还有一个是输出变量值的displayAllName()的方法。类中的代码比较简单,具体如下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 import Foundation
class Father {
var surname: String = ""
var name:String = ""
init(surname:String = "", name:String = "") {
self.surname = surname
self.name = name
}
func displayAllName() {
print("我叫\(self.surname)\(self.name)")
}
}
如果要定义抽象类,只需把上面的构造器进行一个修改即可。抽象类即为专门用来做其他类的父类的类,抽象类不能够直接被实例化,所以把其构造器定义为私有的就可以达到不能直接被实例化的目的。如果要把上述类修改成抽象类,那么把上面的构造函数替换成下方私有的构造函数即可。
1
2
3
4 private init() {
self.surname = ""
self.name = ""
}
2.实现Father的子类Children
Children类继承自Father类,并在Father类的基础上做了相应的扩充。Children中的构造器调用了父类的构造器来对父类的一些属性进行初始化,当然,你也可以直接使用self来访问父类的非私有属性进行初始化,因为Children是继承自Father的,所以Father中非私有的东西都是视为己有的所以可以使用self来访问父类非私有的东西。子类持有了父类的非私有的东西,同时还可以增加属于自己的东西,子类肯定是要在父类的基础上在添加一些属于自己特有的东西。Children添加了父类中没有的job和disPlayMyJob的方法。
1
2
3
4
5
6
7
8
9
10
11
12
13 class Children: Father {
var job:String = ""
init(surname:String = "", name:String = "", job:String = "") {
super.init(surname: surname, name: name)
self.job = job
}
func displayMyJob() {
print("我的工作是\(self.job)")
}
}
3.Children类的实例化
Chidren就是个类,其使用方式没有什么特别之处,就是调用构造器来进行类的实例化。实例化后,就可以调用类的非私有的属性和方法了,具体代码如下:
1
2
3 let children = Children(surname:"li", name:"zelu", job:"Coder")
children.displayAllName()
children.displayMyJob()
4.防止类的子类化
抽象类的使命是专门用来继承的,而有些类是不想让其他类进行继承的(丁克家族)。举个例子,有些小夫妻呢,就不想要孩子,那么怎么办呢?在Swift中也是有final关键字的,被final关键字所修饰的类是不能用来继承的。我们可以把Father类定义成final类型,并观察Children发生的变化。下方是修改后Father类的代码:
1
2
3
4 final class Father {
……………………
……………………
}
Father添加上final关键字修饰后如果Children还对其进行继承那么就会报下面的错误,如下所示:

二、访问权限
Swift中的访问权限与其他面向对象编程语言有所不同,虽然Swift中的访问权限也分为3个等级,但是每个等级所能访问的区域与其他编程语言相比还是有些区别的。在Swift的访问权限包括public, private, internal三种访问级别。下面将要对这三个级别一一进行介绍。
public: 公有访问权限,类或者类的公有属性或者公有方法可以从文件或者模块的任何地方进行访问。那么什么样才能成为一个模块呢?一个App就是一个模块,一个第三方API, 第三等方框架等都是一个完整的模块,这些模块如果要对外留有访问的属性或者方法,就应该使用public的访问权限。
private: 私有访问权限,被private修饰的类或者类的属性或方法可以在同一个物理文件中访问。如果超出该物理文件,那么有着private访问权限的属性和方法就不能被访问。
internal: 顾名思义,internal是内部的意思,即有着internal访问权限的属性和方法说明在模块内部可以访问,超出模块内部就不可被访问了。在Swift中默认就是internal的访问权限。
关于访问权限的实例就不过赘述了,理解起来还算是简单的,今天的博客就先到这儿,接下来回继续更新关于Swift相关的博客。如有错误还望批评指正。
Swift 之类的继承与类的访问权限的更多相关文章
- 窥探Swift之类的继承与类的访问权限
上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swift中的类开了个头.关于类的内容还有很多,今天就来搞一下类中的继承以及类的访问权限.说到类的继承,接触过 ...
- C++中类继承public,protected和private关键字作用详解及派生类的访问权限
注意:本文有时候会用Visual Studio Code里插件的自动补全功能来展示访问权限的范围(当且仅当自动补全范围等价于对象访问权限范围的时候),但是不代表只要是出现在自动补全范围内的可调用对象/ ...
- Java基础详解 (一)Java的类成员访问权限修饰词(以及类访问权限)
在一个类的内部,其成员(包括成员变量和成员函数)能否被其他类所访问,取决于该成员的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下),protected和public.其权 ...
- C++继承后的函数访问权限
今天在写代码时发现对继承后的函数访问权限不太清楚,于是自己做了个测试: 1.头文件(test.h) 1 #include <iostream> 2 using namespace std ...
- Chapter6_访问权限控制_类的访问权限
在Java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的,类既不可以是private也不可以是protected的,对于类的访问权限,只有两种选择:包访问权限或者public.下 ...
- Java编程思想学习笔记——类的访问权限
类的访问权限 Java中,访问权限修饰词用于确定库中哪些类对于该库的使用者是可用的. public class Foo{ } 注意点: 每个文件(编译单元)只能有一个public类. public类的 ...
- php类的继承(基本概念,访问权限修饰符,重写override)
类的继承 简单理解: 某个类A具有某些特征,另一个类B,也具有A类的所有特征,并且还可能具有自己的更多的一些特征,此时,我们就可以实现:B类使用A的特征信息并继续添加自己的一些特有特征信息. 基本概念 ...
- java类的访问权限
1.解析 Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符. private: Java语言中对访问权限限制的最窄的修 ...
- java基础-类成员访问权限控制
一 前言 这篇文章是很基础的一文,没多大深度,对于开发人员必然是熟练于心.本篇文章的主题是为什么java要设置类成员访问级别?其原因也很简单,就是为了面向对象的封装特性:将类成员使用不同的访问级别控制 ...
随机推荐
- springboot 2 集成 redis 缓存 序列化
springboot 缓存 为了实现是在数据中查询数据还是在缓存中查询数据,在application.yml 中将mybatis 对应的mapper 包日志设置为debug . spring: dat ...
- python随机生成图片
#-*-coding:utf-8-*- import tensorflow as tf import numpy as np import cv2 image = tf.random_uniform( ...
- 二进制操作(1)–Bytes
1,Bytes的单元被当作字符串处理. 例如: 有些介绍会声称上述程序会得到这样的结果:b'\x00\x00\x00\x00' 在python v2.7.10上是得不到此结果的. 实际上,如果 typ ...
- sudo apt-get update报错E: 部分索引文件下载失败。如果忽略它们,那将转而使用旧的索引文件。
解决方案1: 将对应的PPA删除掉即可 cd /etc/apt/suorces.list.d mv **.list **.list.bak 解决方案2: 更改源 cp /etc/apt/source_ ...
- leyou_01_自定义异常处理器
1.自定义异常处理器,当程序发生异常时可以我们可以自己定义返回的,状态码和状态信息 2.当异常发生时调用我们的自定义异常 @RestController @RequestMapping("i ...
- (转)nodejs
在写node.js代码时,我们经常需要自己写模块(module).同时还需要在模块最后写好模块接口,声明这个模块对外暴露什么内容.实际上,node.js的模块接口有多种不同写法.这里作者对此做了个简单 ...
- Trie性能分析之敏感词过滤golang
package util import ( "strings" ) type Node struct { //rune表示一个utf8字符 char rune Data inter ...
- (二)通过JAVA调用SAP接口 (增加一二级参数)
(二)通过JAVA调用SAP接口 (增加一二级参数) 一.建立sap连接 请参考我的上一篇博客 JAVA连接SAP 二.测试项目环境准备 在上一篇操作下已经建好的环境后,在上面的基础上新增类即可 三. ...
- MyBatis-Spring(一)--搭建步骤
MyBatis-Spring项目不是Sring项目的子框架,而是由MyBatis社区开发的,所以在使用之前首先要导入mybatis-spring包,我是通过maven添加的依赖: <depend ...
- C#icon图标文件转Image
Icon icon = ICONHelper.GetFileIcon(filePath); MemoryStream mStream = new MemoryStream();//创建内存流 icon ...