郝萌主倾心贡献。尊重作者的劳动成果。请勿转载。

假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主。捐赠数额任意。重在心意^_^

我要捐赠: 点击捐赠

Cocos2d-X源代码下载:点我传送


继承性是面向对象的重要概念之中的一个。 子类可以继承父类的某些方法和成员变量。 
作用域限定符为private的成员变量是不能够被继承的。

子类还能够重写父类的方法。


当然,这一切要从根类開始:

没有父类的类,位于类层次结构的最顶层,称为根(Root)类。

NSObject是层次结构的最顶端(也就是它上面没有不论什么类),因此称为根类。

假设使用术语。能够将类称为子类和父类。相同,也能够将类称为子类和超类。

须要注意的是,要在子类中直接使用实例变量,必须先在接口部分声明。

在实现部分声明和合成(synthesize)的实例变量是私有的。子类中并不可以直接訪问。

须要明白定义或合成取值方法。才干訪问实例变量的值。

继承的概念作用于整个继承链。

一定要理解下面事实:类的每一个实例都拥有自己的实例变量。即使这些实例变量是继承来的。

找出正确的方法:

首先,检查该对象所属的类,以查看在该类中是否明白定义了一个具有指定名称的方法。

假设有,就使用这种方法。假设未定义,就检查它的父类。

假设父类中有定义,就使用这种方法,否者。继续找寻。

直到找到根类也没有发现不论什么方法。

通过继承来扩展:加入新方法

继承通经常使用于扩展一个类。

@class指令:

@class XYPoint;

#import "XYPoint.h"

使用@class指令提高了效率。由于编译器不须要引入和处理整个XYPoint.h文件(尽管它非常小)。

仅仅须要知道XYPoint是一个类名。

假设须要引用XYPoint类的方法(在实现部分中),@class指令是不够的,由于编译器须要很多其它的消息。

说的通俗点:仅仅引用了类就用@class不然就用#import。

在默认情况下。合成的设值方法仅仅是简单地复制对象指针,而不是对象本身。

你能够合成还有一种设值方法,而不是制作对象的副本。

为了了解继承性, 我们看看这种一个场景: 
一位刚学习面向对象的小菜,自从当上了班长。他就有的忙了。由于录入档案。须要描写叙述和处理个人信息。

于是他定义了类Person:
@interface Person: NSObject {

NSString* name;

int age;

NSDate birthDate;

}

-(NSString*) getInfo;

@end


新的校花School Beauty类:
一周以后。 小菜又遇到了新的需求。 他的几个表妹非要把各自学校的校花介绍给我他,烦恼呀!

须要描写叙述和处理校花信息, 于是他又定义了一个新的类Beauty。

@interface Beauty:
NSObject {

NSString* name;

int age;

NSDate birthDate;

NSString* school;

}

-(NSString*) getInfo;

@end


小结
Beauty和Person两个类的结构太接近了, 
后者仅仅比前者多出一个属性school
。 却要反复定义其他全部的内容。


Objective-C提供了解决类似问题的机制, 那就是类的继承。 

@interface Beauty:
Person {

NSString* school;

}

方法重写或者说是覆写方法:

不能通过继承删除或降低方法。但能够利用覆写来更改继承方法的定义。

新方法必须具有同样的返回类型,而且參数的数目与覆写的方法同样。

假设在不同的类中有名称同样的方法,则依据作为消息的接收者的类选择正确的方法。

为什么要创建子类?

有例如以下3个理由:

1)希望继承一个类的方法,或许增加一些新的方法和或实例变量。

2)希望创建一个类的特别的版本号。

3)希望通过覆写一个或多个方法来改变类的默认行为。

抽象类:

有时,创建类仅仅是为了更easy创建子类。

因此,这些类名为抽象(abstract)类,或等价地称为抽象超类(abstract superclasses)。

在该类中定义方法和实例变量,但不期望不论什么人从该类创建实例。

注意:

子类不能继承父类中作用域限定符为@private的成员变量。 
子类能够重写父类的方法,及命名与父类同名的成员变量。 

以下再通过一个矩形类和正方形类的实例说明方法重写问题:
Rectangle.h文件:
  1. #import <Foundation/NSObject.h>
  2.  
  3. @interface Rectangle: NSObject {
  4. int width;
  5. int height;
  6. }
  7.  
  8. -(Rectangle*) initWithWidth: (int) w height: (int) h;
  9. -(void) setWidth: (int) w;
  10. -(void) setHeight: (int) h;
  11. -(void) setWidth: (int) w height: (int) h;
  12. -(int) width;
  13. -(int) height;
  14. -(void) print;
  15. @end
Rectangle.m文件:
  1. #import "Rectangle.h"
  2.  
  3. @implementation Rectangle
  4.  
  5. -(Rectangle*) initWithWidth: (int) w height: (int) h {
  6. self = [super init];
  7.  
  8. if ( self ) {
  9. [self setWidth: w height: h];
  10. }
  11.  
  12. return self;
  13. }
  14.  
  15. -(void) setWidth: (int) w {
  16. width = w;
  17. }
  18.  
  19. -(void) setHeight: (int) h {
  20. height = h;
  21. }
  22.  
  23. -(void) setWidth: (int) w height: (int) h {
  24. width = w;
  25. height = h;
  26. }
  27.  
  28. -(int) width {
  29. return width;
  30. }
  31.  
  32. -(int) height {
  33. return height;
  34. }
  35.  
  36. -(void) print {
  37. NSLog(@"width = %i, height = %i", width, height );
  38. }
  39. @end
Square.h文件:
  1. #import "Rectangle.h"
  2.  
  3. @interface Square: Rectangle
  4. -(Square*) initWithSize: (int) s;
  5. -(void) setSize: (int) s;
  6. -(int) size;
  7. @end
Square.m文件:
  1. #import "Square.h"
  2.  
  3. @implementation Square
  4. -(Square*) initWithSize: (int) s {
  5. self = [super init];
  6.  
  7. if ( self ) {
  8. [self setSize: s];
  9. }
  10.  
  11. return self;
  12. }
  13.  
  14. -(void) setSize: (int) s {
  15. width = s;
  16. height = s;
  17. }
  18.  
  19. -(int) size {
  20. return width;
  21. }
  22.  
  23. -(void) setWidth: (int) w {
  24. [self setSize: w];
  25. }
  26.  
  27. -(void) setHeight: (int) h {
  28. [self setSize: h];
  29. }
  30. @end
调试用的main函数:
  1. #import <Foundation/Foundation.h>
  2. #import "Square.h"
  3. #import "Rectangle.h"
  4.  
  5. int main (int argc, const char * argv[]) {
  6.  
  7. Rectangle *rec = [[Rectangle alloc] initWithWidth: 10 height: 20];
  8. Square *sq = [[Square alloc] initWithSize: 15];
  9.  
  10. NSLog(@"Rectangle: " );
  11. [rec print];
  12.  
  13. NSLog(@"Square: " );
  14. [sq print];
  15.  
  16. [sq setWidth: 20];
  17. NSLog(@"Square after change: " );
  18. [sq print];
  19.  
  20. [rec release];
  21. [sq release];
  22.  
  23. return 0;
  24. }
执行结果:
Rectangle:

width = 10, height = 20

Square:

width = 15, height = 15

Square after change:

width = 20, height = 20

Objective-C之成魔之路【10-继承性】的更多相关文章

  1. Objective-C之成魔之路【0-序章】

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠,支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 C语言首创 ...

  2. Objective-C之成魔之路【5-选择结构】

    郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 Objec ...

  3. Objective-C之成魔之路【9-类构造方法和成员变量作用域、以及变量】

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 构造方法 ...

  4. 《带你装B,带你飞》pytest成魔之路4 - fixture 之大解剖

    1. 简介 fixture是pytest的一个闪光点,pytest要精通怎么能不学习fixture呢?跟着我一起深入学习fixture吧.其实unittest和nose都支持fixture,但是pyt ...

  5. Objective-C之成魔之路【16-使用文件】

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 语言的设计 ...

  6. Objective-C之成魔之路【13-预处理程序】

    郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 预处理提供 ...

  7. Objective-C之成魔之路【19-归档】

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 在Obje ...

  8. Objective-C之成魔之路【8-訪问成员变量和属性】

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 訪问成员变 ...

  9. Objective-C之成魔之路【7-类、对象和方法】

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 Objec ...

随机推荐

  1. mvn 发布

    mvn clean install deploy -Dadditionalparam=-Xdoclint:none

  2. Thymeleaf模板引擎+Spring整合使用方式的介绍

    尊重原创,原文地址为:https://www.cnblogs.com/jiangchao226/p/5937458.html 前言 这个教程介绍了Thymeleaf与Spring框架的集成,特别是Sp ...

  3. Matplotlib基本图形之条形图

    Matplotlib基本图形之条形图 条形图特点: 以长方形的长度为变量的统计图表用来比较多个数据分类的数据大小通常用于较小的数据集分析例如不同季度的销量,不同国家的人口 示例代码: import o ...

  4. 学习笔记1——下载和安装WordPress

    首先,到WordPress官方网站下载WordPress,下载地址https://cn.wordpress.org/txt-download/ 然后,将下载后的文件夹放在www目录下,到浏览器中输入l ...

  5. javascript前端下载

    <html> <head> <title>测试标题</title> </head> <body> <div> 测试页 ...

  6. 解决Linux 服务器ntpdate同步时间报错 the NTP socket is in use, exiting

    错误信息: 错误原因分析: 由于 xntpd 已经绑定到了该 Socket.运行 ntpdate 时,它会首先进行广播,然后侦听端口 123. 如果 xntpd 正在运行,而有一个进程已经在侦听该端口 ...

  7. LCA+主席树 (求树上路径点权第k大)

      SPOJ 10628. Count on a tree (树上第k大,LCA+主席树) 10628. Count on a tree Problem code: COT You are given ...

  8. 简单介绍一下solr?

    简单介绍一下solr? Solr是一个独立的企业级搜索应用服务器,它对外提供类似于web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可 ...

  9. java.lang.Class解析

    java.lang.Class 1.java.lang.Class的概念 当一个类或接口被装入的JVM时便会产生一个与之关联的java.lang.Class对象,java.lang.class类就是用 ...

  10. bzoj2144 跳跳棋 二分

    [bzoj2144]跳跳棋 Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位 ...