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 之类的继承与类的访问权限的更多相关文章

  1. 窥探Swift之类的继承与类的访问权限

    上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swift中的类开了个头.关于类的内容还有很多,今天就来搞一下类中的继承以及类的访问权限.说到类的继承,接触过 ...

  2. C++中类继承public,protected和private关键字作用详解及派生类的访问权限

    注意:本文有时候会用Visual Studio Code里插件的自动补全功能来展示访问权限的范围(当且仅当自动补全范围等价于对象访问权限范围的时候),但是不代表只要是出现在自动补全范围内的可调用对象/ ...

  3. Java基础详解 (一)Java的类成员访问权限修饰词(以及类访问权限)

    在一个类的内部,其成员(包括成员变量和成员函数)能否被其他类所访问,取决于该成员的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下),protected和public.其权 ...

  4. C++继承后的函数访问权限

    今天在写代码时发现对继承后的函数访问权限不太清楚,于是自己做了个测试: 1.头文件(test.h) 1 #include <iostream>  2 using namespace std ...

  5. Chapter6_访问权限控制_类的访问权限

    在Java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的,类既不可以是private也不可以是protected的,对于类的访问权限,只有两种选择:包访问权限或者public.下 ...

  6. Java编程思想学习笔记——类的访问权限

    类的访问权限 Java中,访问权限修饰词用于确定库中哪些类对于该库的使用者是可用的. public class Foo{ } 注意点: 每个文件(编译单元)只能有一个public类. public类的 ...

  7. php类的继承(基本概念,访问权限修饰符,重写override)

    类的继承 简单理解: 某个类A具有某些特征,另一个类B,也具有A类的所有特征,并且还可能具有自己的更多的一些特征,此时,我们就可以实现:B类使用A的特征信息并继续添加自己的一些特有特征信息. 基本概念 ...

  8. java类的访问权限

    1.解析 Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符. private: Java语言中对访问权限限制的最窄的修 ...

  9. java基础-类成员访问权限控制

    一 前言 这篇文章是很基础的一文,没多大深度,对于开发人员必然是熟练于心.本篇文章的主题是为什么java要设置类成员访问级别?其原因也很简单,就是为了面向对象的封装特性:将类成员使用不同的访问级别控制 ...

随机推荐

  1. Activiti历史查看

    流程执行完毕后,究竟去了哪里有些疑问. 虽然已完成的任务在act_ru_task和act_ru_execution表中都已被删除,但是这些数据还存在activiti的数据库中,作为历史改由Histor ...

  2. mysql密码管理

    1.密码丢失找回: (1)关闭mysql服务进程(2)跳过mysql权限检测:在mysql的配置文件中的mysqld节点下面添加skip-grant-tables的服务器配置项,或者启动服务时加上-- ...

  3. springboot核心技术(二)-----自动配置原理、日志

    自动配置原理 配置文件能配置的属性参照 1.自动配置原理: 1).SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 2).@Enable ...

  4. alert提示框去掉域名

    window.alert = function(name){ var iframe = document.createElement("IFRAME"); iframe.style ...

  5. Leetcode543.Diameter of Binary Tree二叉树的直径

    给定一棵二叉树,你需要计算它的直径长度.一棵二叉树的直径长度是任意两个结点路径长度中的最大值.这条路径可能穿过根结点. 示例 : 给定二叉树 1 / \ 2    3 / \ 4  5 返回 3, 它 ...

  6. phpSpider 单页测试_模拟登陆

    <?php require './vendor/autoload.php'; use phpspider\core\phpspider; use phpspider\core\requests; ...

  7. BaiduTemplate [ 百度模板引擎 ]

    地址: http://baidufe.github.io/BaiduTemplate/

  8. 彻底删除 Git 项目中的文件(BFG Repo-Cleaner 用法)

    一些时候由于开发初期经验不足和贪图方便, 会把一些不应该提交到 Git 的文件上传到 Github, 带来一系列安全问题, 更有可能是把一些大文件上传到 GitHub 上, 导致项目非常臃肿, 每次 ...

  9. 关于网上大量对Vue双向绑定的错误理解

    对于Vue的双向绑定,现在基本是个前端都听说过,面试官也喜欢问这个问题.但对于Vue双向绑定的原理,掘金.博客园和segmentfault等技术社区充斥着大量的错误文章.这些文章的题目基本样子如下 “ ...

  10. opencv java swing 图片灰度化 二值化

    工程下载地址 https://download.csdn.net/download/qq_16596909/11503860 基于maven 首先引入opencv <!-- https://mv ...