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要设置类成员访问级别?其原因也很简单,就是为了面向对象的封装特性:将类成员使用不同的访问级别控制 ...
随机推荐
- C++面向对象高级编程(上)-Geekband
头文件和类声明 一定要注意使用防卫式的头文件声明: #ifndef _CLASSHEAD_ #define _CLASSHEAD_ . . . . #endif 基于对象和面向对象 : 基于对象 单一 ...
- HBase 物理视图
- tcpdump 抓包
简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...
- Python中的urlparse、urllib抓取和解析网页(一)
对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...
- Odoo(OpenERP)配置文件详解
[options] ; addons模块的查找路径 addons_path = E:\GreenOdoo8.0\source\openerp\addons ; 管理员主控密码(用于创建.还原和备份数据 ...
- 全栈之路-微信小程序-SKU开发(代码)
SKU开发是小程序中最难的一部分,思路在分析中已经记录过了,这里主要看一下代码的实现,感觉老师写的代码太棒了,很优雅!主要想记录一下写代码的思路,对面向对象编程的实践. 一.代码结构的分析 1.说明几 ...
- set_clock_latency
set_clock_latancy用于定于虚拟时钟与真实时钟的延时 考虑最糟糕的情况,评估setup时数据会使用最大延时,时钟使用最小延时:评估hold时,数据使用最小延时,时钟使用最大延时.
- HZOI20190823模拟31题解
题面:https://www.cnblogs.com/Juve/articles/11425141.html math:仔细看看其实是个水题 #include<iostream> #inc ...
- select 下拉框多选
需要引入插件:fselect.js (此插件依赖jQ) 和 fselect.css 下载 点击查看在线演示地址 //html<select class="demo" mul ...
- autoreleasing的用法介绍:
在c/c++,objective-c内存管理中有一条是:谁分配谁释放. __autoreleasing则可以使对像延迟释放.比如你想传一个未初始化地对像引用到一个方法当中,在此方法中实始化此对像,那么 ...