OC第六节—— 继承与类别
1、继承: 父类和子类的关系。
1.1 生活中的继承
父类 子类 父类 子类 对象
人 男人 男人 老男人 xiDaDa
外星人 变形精钢 变形精钢 汽车人 大黄蜂、擎天柱
生物 动物 动物 猫 多啦A梦
人
男人 女人
老男人 小女人
外星人
变形精钢 火星人
汽车人
【名词】
父类 parenClass 超类 superClass 基类
子类 childClass 子类 subClass 派生类
【注】
把继承又叫做派生
父类的属性(成员变量)和方法,子类可以直接获取,这个过程就叫做继承
子类在父类的基础上,创建了自己独有的成员变量和方法,这个过程就叫做
派生。
继承和派生其实是说的继承概念的不同的侧重点。
1.2 代码中的继承
<1>继承的基本语法
a.
@interface 子类名:父类名
@end
b.继承之后
子类可以使用父类的所有方法
子类可以获得父类非私有的成员变量
<2>重写
1.子类从父类继承的方法, 有时候不适合子类,子类可以重写这个方法
2.重写就是重新实现一遍父类的方法(方法名一样 实现内容不同)
3.子类重写父类方法之后,子类对象最终执行的是子类重写之后的方法
1.3 继承在内存中的体现
子类继承父类之后 子类对象的构成:
1) 父类的字段和方法
2) 子类自己独有的字段和方法
画图画出子类对象的构成
【继承的作用】
1、快速创建多个形似的类
2、对类进行扩展
3、自定义一些系统的一些功能控件
myButton : UIButton
- //父类
- #import <Foundation/Foundation.h>
- @interface Car : NSObject
- {
- NSString *_brand;
- NSString *_color;
- }
- //@property 生成的是私有的成员变量
- @property (nonatomic, copy) NSString *brand;
- @property (nonatomic, copy) NSString *color;
- //- (void)setBrand:(NSString *)brand;
- //- (void)setColor:(NSString *)color;
- //
- //- (NSString *)brand;
- //- (NSString *)color;
- @end
- #import "Car.h"
- @implementation Car
- //@synthesize brand = _brand;
- //- (void)setBrand:(NSString *)brand
- //{
- // _brand = brand;
- //}
- //- (void)setColor:(NSString *)color
- //{
- // _color = color;
- //}
- //
- //- (NSString *)brand
- //{
- // return _brand;
- //}
- //- (NSString *)color
- //{
- // return _color;
- //
- //}
- //子类
- #import "Car.h"
- @interface Trunk : Car
- {
- NSInteger _weight;
- }
- - (void)setWeight:(NSInteger)weight;
- - (NSInteger)weight;
- - (NSString *)description;
- @end
- #import "Trunk.h"
- @implementation Trunk
- - (void)setWeight:(NSInteger)weight
- {
- _weight = weight;
- }
- - (NSInteger)weight
- {
- return _weight;
- }
- - (NSString *)description
- {
- return [NSString stringWithFormat:@"brand: %@, color: %@, weight: %ld", _brand, _color, _weight];
- }
- @end
- //子类
- #import "Car.h"
- //继承父类Car的_brand 和 _color 字段
- //继承了父类的
- //- (void)setBrand:(NSString *)brand;
- //- (void)setColor:(NSString *)color;
- //
- //- (NSString *)brand;
- //- (NSString *)color;
- @interface Taxi : Car
- {
- NSString *_company;
- }
- - (void)setCompany:(NSString *)company;
- - (NSString *)company;
- - (NSString *)description;
- @end
- #import "Taxi.h"
- @implementation Taxi
- - (void)setCompany:(NSString *)company
- {
- _company = company;
- }
- - (NSString *)company
- {
- return _company;
- }
- - (NSString *)description
- {
- return [NSString stringWithFormat:@"brand: %@, color: %@, company: %@", _brand,_color,_company];
- }
- @end
- //主函数
- #import <Foundation/Foundation.h>
- #import "Taxi.h"
- #import "Trunk.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- Taxi *taxi = [[Taxi alloc] init];
- [taxi setBrand:@"大众"];
- [taxi setCompany:@"中南"];
- [taxi setColor:@"绿色"];
- NSLog(@"taxi: %@", taxi);
- Trunk *trunk = [[Trunk alloc] init];
- [trunk setBrand:@"东风"];
- [trunk setColor:@"黄色"];
- [trunk setWeight:10000];
- NSLog(@"trunk: %@", trunk);
- }
- return 0;
- }
———————————————————
2、多态与类的消息机制 (多态—多种状态)
【多态】重载(OC没有)、重写、虚函数
//其实多态就是指,同一个接口不同的实现
OC里面的方法,叫做虚方法
【虚方法】
1.响应消息,不看指针,看对象。
2.父类的指针,可以指向子类的对象。
【注】
虚方法体现了不同事物被同一事件触发,有不同的响应。
给不同对象发送相同的消息,反应不一样。
1、父类的指针指向子类的对象
2、多态的应用。
幼儿园—
老师ask:boy , boy 回答“不是我”; tell
老师ask: girl girl 回答“就是他” tell
继承关系:
Kid 小孩类作为 -父类 tell方法
boy 继承于kid 重写 tell — “不是我”
girl 继承于KId 重写tell — “就是他”
Teacher
- //老师
- #import <Foundation/Foundation.h>
- #import "Kid.h"
- @interface Teacher : NSObject
- - (void)askKid:(Kid *)kid;
- @end
- #import "Teacher.h"
- @implementation Teacher
- - (void)askKid:(Kid *)kid
- {
- NSLog(@"老师问: %@", [kid class]);
- [kid tell];
- }
- @end
- //孩子
- #import <Foundation/Foundation.h>
- @interface Kid : NSObject
- - (void)tell;
- @end
- #import "Kid.h"
- @implementation Kid
- - (void)tell
- {
- return;
- }
- @end
- //男孩
- #import "Kid.h"
- @interface Boy : Kid
- @end
- #import "Boy.h"
- @implementation Boy
- - (void)tell
- {
- NSLog(@"不是我!");
- }
- @end
- //女孩
- #import "Kid.h"
- @interface Girl : Kid
- @end
- #import "Girl.h"
- @implementation Girl
- - (void)tell
- {
- NSLog(@"就是他!");
- }
- @end
- //主函数
- #import <Foundation/Foundation.h>
- #import "Teacher.h"
- #import "Boy.h"
- #import "Girl.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- Teacher *laowang = [[Teacher alloc] init];
- Boy *boy = [[Boy alloc] init];
- Girl *girl = [[Girl alloc] init];
- [laowang askKid:boy];
- [laowang askKid:girl];
- }
- return 0;
- }
3、打豆豆—打不同的动物,不同的响应
Animal 父类
- (void)beaten;
Cat —
Tiger
Duck
Person
- (void)beatAnimal:(Animal *)animal
{
[animal beaten];
}
———————————————————
5、类别/类目 category
思考:如何给NSString 添加一个逆序的方法。
<1>类别的基本语法
@interface 类名 (类别名)
例如:给字符串添加扩充一个逆序的方法
@interface NSString (Reverse) //()扩充的类别的名字
//不能够扩充成员变量,只能够扩充方法
- (NSString *)reverseString;
@end
@implementation NSString (Reverse)
//逆序
- (NSString *)reverseString
{
NSMutableString *string = [[NSMutableString alloc] init];
for (NSInteger i = [self length] - 1; i >= 0; i --) {
unichar C = [self characterAtIndex:i];
[string appendFormat:@"%C", C];
}
return string;
}
//输出字符串
- (void)putString
{
NSLog(@"%@", self);
}
@end
//需要在使用类别方法的文件里面倒入类别的头文件
#import "NSString+Reverse.h"
注:一旦使用类别给已有的类增补方法,那么这个类的对象就可以使用这个方法
<2>.类别功能:
1. 可以给已有/ 系统原生的类增补方法
2.可以对类的方法进行分类管理,可以将类的实现分散到多个不同文件或多个不同框架中。
<3>使用类别需要注意的问题
1.类别中不能添加成员变量
2.使用类别增补的方法须导入类别头文件
3.父类类别中的方法,子类也可以用
<4>类扩展/匿名类别
当不想对外公开一些类的方法时,我们可以使用类扩展
1.类扩展的基本语法
在.m文件中
@interface Person()//没有名字
- (void)song;
@end
@implementation Person
- (void)song{
NSLog(@"我心永恒");
}
@end
注: 类扩展中的声明和实现都放在.m文件中
2.类扩展的功能
1.可以实现私有方法
2.方便程序员调用不公开的方法
3.可以声明成员变量
OC第六节—— 继承与类别的更多相关文章
- 第四百零六节,自定义用户表类来继承Django的用户表类,
第四百零六节,自定义用户表类来继承Django的用户表类, models.py from django.db import models # Create your models here. from ...
- 第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承
第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (30) ------ 第六章 继承与建模高级应用之多对多关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第六章 继承与建模高级应用 现在,你应该对实体框架中基本的建模有了一定的了解,本章 ...
- 第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍
第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍 Requests请求 Requests请求就是我们在爬虫文件写的Requests() ...
- 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型
第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
ASP.NET MVC深入浅出系列(持续更新) 一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...
- 大白话5分钟带你走进人工智能-第二十六节决策树系列之Cart回归树及其参数(5)
第二十六节决策树系列之Cart回归树及其参数(5) 上一节我们讲了不同的决策树对应的计算纯度的计算方法, ...
- 风炫安全web安全学习第三十六节课-15种上传漏洞讲解(一)
风炫安全web安全学习第三十六节课 15种上传漏洞讲解(一) 文件上传漏洞 0x01 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...
- 基于Extjs的web表单设计器 第六节——界面框架设计
基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...
随机推荐
- A.Kaw矩阵代数初步学习笔记 4. Unary Matrix Operations
“矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...
- hihocoder #1052 基因工程
传送门:基因工程 这道题拖了好久,一直没有清晰的思路. 当然,$K\le\frac{N}{2}$时,比较简单.下面我着重讲一下当$K>\frac{N}{2}$,即前$K$个字符与后$K$个字符有 ...
- iOS - 利用runtime加深对基础知识的理解
利用runtime加深对基础知识的理解 如果对runtime需要学习,可以看这篇,以下仅作为学习笔记,相互交流. runtime的头文件: #import <objc/runtime.h> ...
- JavaScript DES 加密tripledes.js:
<html> <head> <meta http-equiv="content-type" content="text/html; char ...
- JS-制作网页特效——选项卡效果(水平,点击)
//总结:这个样式的思维很重要,以前刚开始做,想的都是,怎么获取到自己点击的是哪一个li,然后给他以对应的div样式.后来发现难点是,怎么找到另外两个没有被点击的li和他们对应的div.把他们的样式去 ...
- cocos2d 3.6 win7下的配置
我搭建cocos2.6的开发环境需要安装工具包括: 1.Visual Studio 2012(由于不兼容win7,需要安装Update 4)和虚拟光驱daemon tool,虚拟光驱的下载地址:htt ...
- CentOS 6.x安装Metasploit
现在开始安装Metasploit框架,前面的包安装成功之后,我们需要再安装一些Metasploit依赖的Ruby库,命令如下: gem install wirble pg sqlite3 msgpac ...
- eclipse自动部署问题
1. 使用myeclipse自动部署的方法(使用myeclipse 2015自动部署有问题,待解决)(换成2014的便可以自动部署): 1.Window->preferences->Mye ...
- JavaWeb学习笔记——开发动态WEB资源(二)HelloWord
该工程的功能是在页面上输出一段话 首先在src里面新建一个class,在interface里面添加javax.servlet.Servlet 以下是HelloServlet.java中的代码: pac ...
- Android学习笔记——button_activity
工程的功能是实现在一个acticity上点击按钮,切换到另外一个activity 以下代码为MainActivity.java中的代码 package com.example.button_activ ...