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

  1. //父类
  2.  
  3. #import <Foundation/Foundation.h>
  4.  
  5. @interface Car : NSObject
  6. {
  7. NSString *_brand;
  8. NSString *_color;
  9. }
  10. //@property 生成的是私有的成员变量
  11. @property (nonatomic, copy) NSString *brand;
  12. @property (nonatomic, copy) NSString *color;
  13. //- (void)setBrand:(NSString *)brand;
  14. //- (void)setColor:(NSString *)color;
  15. //
  16. //- (NSString *)brand;
  17. //- (NSString *)color;
  18. @end
  19.  
  20. #import "Car.h"
  21.  
  22. @implementation Car
  23. //@synthesize brand = _brand;
  24.  
  25. //- (void)setBrand:(NSString *)brand
  26. //{
  27. // _brand = brand;
  28. //}
  29. //- (void)setColor:(NSString *)color
  30. //{
  31. // _color = color;
  32. //}
  33. //
  34. //- (NSString *)brand
  35. //{
  36. // return _brand;
  37. //}
  38. //- (NSString *)color
  39. //{
  40. // return _color;
  41. //
  42. //}
  1. //子类
  2.  
  3. #import "Car.h"
  4.  
  5. @interface Trunk : Car
  6. {
  7. NSInteger _weight;
  8. }
  9. - (void)setWeight:(NSInteger)weight;
  10. - (NSInteger)weight;
  11. - (NSString *)description;
  12. @end
  13.  
  14. #import "Trunk.h"
  15.  
  16. @implementation Trunk
  17. - (void)setWeight:(NSInteger)weight
  18. {
  19. _weight = weight;
  20. }
  21. - (NSInteger)weight
  22. {
  23. return _weight;
  24. }
  25. - (NSString *)description
  26. {
  27. return [NSString stringWithFormat:@"brand: %@, color: %@, weight: %ld", _brand, _color, _weight];
  28. }
  29. @end
  1. //子类
  2.  
  3. #import "Car.h"
  4. //继承父类Car的_brand 和 _color 字段
  5. //继承了父类的
  6. //- (void)setBrand:(NSString *)brand;
  7. //- (void)setColor:(NSString *)color;
  8. //
  9. //- (NSString *)brand;
  10. //- (NSString *)color;
  11.  
  12. @interface Taxi : Car
  13. {
  14. NSString *_company;
  15. }
  16.  
  17. - (void)setCompany:(NSString *)company;
  18. - (NSString *)company;
  19. - (NSString *)description;
  20. @end
  21.  
  22. #import "Taxi.h"
  23.  
  24. @implementation Taxi
  25. - (void)setCompany:(NSString *)company
  26. {
  27. _company = company;
  28. }
  29. - (NSString *)company
  30. {
  31. return _company;
  32. }
  33. - (NSString *)description
  34. {
  35. return [NSString stringWithFormat:@"brand: %@, color: %@, company: %@", _brand,_color,_company];
  36. }
  37. @end
  1. //主函数
  2.  
  3. #import <Foundation/Foundation.h>
  4. #import "Taxi.h"
  5. #import "Trunk.h"
  6. int main(int argc, const char * argv[])
  7. {
  8.  
  9. @autoreleasepool {
  10. Taxi *taxi = [[Taxi alloc] init];
  11. [taxi setBrand:@"大众"];
  12. [taxi setCompany:@"中南"];
  13. [taxi setColor:@"绿色"];
  14.  
  15. NSLog(@"taxi: %@", taxi);
  16.  
  17. Trunk *trunk = [[Trunk alloc] init];
  18.  
  19. [trunk setBrand:@"东风"];
  20. [trunk setColor:@"黄色"];
  21. [trunk setWeight:10000];
  22.  
  23. NSLog(@"trunk: %@", trunk);
  24.  
  25. }
  26. return 0;
  27. }

———————————————————
2、多态与类的消息机制  (多态—多种状态)
    【多态】重载(OC没有)、重写、虚函数
    //其实多态就是指,同一个接口不同的实现
   
    OC里面的方法,叫做虚方法

【虚方法】
        1.响应消息,不看指针,看对象。
        2.父类的指针,可以指向子类的对象。
    【注】
            虚方法体现了不同事物被同一事件触发,有不同的响应。
            给不同对象发送相同的消息,反应不一样。
    1、父类的指针指向子类的对象
    2、多态的应用。
            幼儿园—
            老师ask:boy  ,  boy 回答“不是我”;  tell
            老师ask: girl       girl   回答“就是他”     tell
    继承关系:
            Kid  小孩类作为 -父类   tell方法
            boy  继承于kid   重写 tell —  “不是我”
            girl    继承于KId   重写tell  —  “就是他”
            
    Teacher

  1. //老师
  2.  
  3. #import <Foundation/Foundation.h>
  4. #import "Kid.h"
  5.  
  6. @interface Teacher : NSObject
  7. - (void)askKid:(Kid *)kid;
  8. @end
  9.  
  10. #import "Teacher.h"
  11.  
  12. @implementation Teacher
  13. - (void)askKid:(Kid *)kid
  14. {
  15. NSLog(@"老师问: %@", [kid class]);
  16. [kid tell];
  17. }
  18. @end
  19.  
  20. //孩子
  21.  
  22. #import <Foundation/Foundation.h>
  23.  
  24. @interface Kid : NSObject
  25. - (void)tell;
  26. @end
  27.  
  28. #import "Kid.h"
  29.  
  30. @implementation Kid
  31. - (void)tell
  32. {
  33. return;
  34. }
  35. @end
  36.  
  37. //男孩
  38.  
  39. #import "Kid.h"
  40.  
  41. @interface Boy : Kid
  42.  
  43. @end
  44.  
  45. #import "Boy.h"
  46.  
  47. @implementation Boy
  48. - (void)tell
  49. {
  50. NSLog(@"不是我!");
  51. }
  52. @end
  53. //女孩
  54.  
  55. #import "Kid.h"
  56.  
  57. @interface Girl : Kid
  58.  
  59. @end
  60. #import "Girl.h"
  61.  
  62. @implementation Girl
  63. - (void)tell
  64. {
  65. NSLog(@"就是他!");
  66. }
  67. @end
  68. //主函数
  69. #import <Foundation/Foundation.h>
  70. #import "Teacher.h"
  71. #import "Boy.h"
  72. #import "Girl.h"
  73. int main(int argc, const char * argv[])
  74. {
  75.  
  76. @autoreleasepool {
  77. Teacher *laowang = [[Teacher alloc] init];
  78. Boy *boy = [[Boy alloc] init];
  79. Girl *girl = [[Girl alloc] init];
  80.  
  81. [laowang askKid:boy];
  82. [laowang askKid:girl];
  83.  
  84. }
  85. return 0;
  86. }

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第六节—— 继承与类别的更多相关文章

  1. 第四百零六节,自定义用户表类来继承Django的用户表类,

    第四百零六节,自定义用户表类来继承Django的用户表类, models.py from django.db import models # Create your models here. from ...

  2. 第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承

    第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页 ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (30) ------ 第六章 继承与建模高级应用之多对多关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第六章  继承与建模高级应用 现在,你应该对实体框架中基本的建模有了一定的了解,本章 ...

  4. 第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍

    第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍 Requests请求 Requests请求就是我们在爬虫文件写的Requests() ...

  5. 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型

    第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...

  6. 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的无状态模 ...

  7. 大白话5分钟带你走进人工智能-第二十六节决策树系列之Cart回归树及其参数(5)

                                                    第二十六节决策树系列之Cart回归树及其参数(5) 上一节我们讲了不同的决策树对应的计算纯度的计算方法, ...

  8. 风炫安全web安全学习第三十六节课-15种上传漏洞讲解(一)

    风炫安全web安全学习第三十六节课 15种上传漏洞讲解(一) 文件上传漏洞 0x01 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...

  9. 基于Extjs的web表单设计器 第六节——界面框架设计

    基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...

随机推荐

  1. A.Kaw矩阵代数初步学习笔记 4. Unary Matrix Operations

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  2. hihocoder #1052 基因工程

    传送门:基因工程 这道题拖了好久,一直没有清晰的思路. 当然,$K\le\frac{N}{2}$时,比较简单.下面我着重讲一下当$K>\frac{N}{2}$,即前$K$个字符与后$K$个字符有 ...

  3. iOS - 利用runtime加深对基础知识的理解

    利用runtime加深对基础知识的理解 如果对runtime需要学习,可以看这篇,以下仅作为学习笔记,相互交流. runtime的头文件: #import <objc/runtime.h> ...

  4. JavaScript DES 加密tripledes.js:

    <html> <head> <meta http-equiv="content-type" content="text/html; char ...

  5. JS-制作网页特效——选项卡效果(水平,点击)

    //总结:这个样式的思维很重要,以前刚开始做,想的都是,怎么获取到自己点击的是哪一个li,然后给他以对应的div样式.后来发现难点是,怎么找到另外两个没有被点击的li和他们对应的div.把他们的样式去 ...

  6. cocos2d 3.6 win7下的配置

    我搭建cocos2.6的开发环境需要安装工具包括: 1.Visual Studio 2012(由于不兼容win7,需要安装Update 4)和虚拟光驱daemon tool,虚拟光驱的下载地址:htt ...

  7. CentOS 6.x安装Metasploit

    现在开始安装Metasploit框架,前面的包安装成功之后,我们需要再安装一些Metasploit依赖的Ruby库,命令如下: gem install wirble pg sqlite3 msgpac ...

  8. eclipse自动部署问题

    1. 使用myeclipse自动部署的方法(使用myeclipse 2015自动部署有问题,待解决)(换成2014的便可以自动部署): 1.Window->preferences->Mye ...

  9. JavaWeb学习笔记——开发动态WEB资源(二)HelloWord

    该工程的功能是在页面上输出一段话 首先在src里面新建一个class,在interface里面添加javax.servlet.Servlet 以下是HelloServlet.java中的代码: pac ...

  10. Android学习笔记——button_activity

    工程的功能是实现在一个acticity上点击按钮,切换到另外一个activity 以下代码为MainActivity.java中的代码 package com.example.button_activ ...