[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第八章 继承
来源:互联网 发布:部队网络使用对照检查 编辑:程序博客网 时间:2024/03/29 15:54
- 在子类使用实例变量,必须先在接口部分声明,在实现部分声明的实例变量是私有的
- ClassB继承ClassA,ClassC继承ClassB. ClassC能继承ClassB的所有方法和实例变量,同时也一次继承A的所有方法和实例变量。
Part1. 继承 扩展
1. 矩形类:
- 声明文件
#import <Foundation/Foundation.h>@interface Rectangle : NSObject@property int width, height;-(void) setWidth: (int) w andHeight: (int) h;-(int) area;-(int) perimeter;@end
- 实现文件
#import "Rectangle.h"@implementation Rectangle@synthesize width, height;-(void) setWidth:(int)w andHeight:(int)h{ width = w; height = h;}-(int) area{ return width * height;}-(int) perimeter{ return (width + height) * 2;}@end
2. 扩展矩形类:
Square类继承Rectangle类,用setSide:方法设置正方形的大小,并利用Rectangle类的方法计算正方形的面积。
- 接口文件
#import "Rectangle.h"@interface Square : Rectangle //继承-(void) setSide : (int) s;-(int) side;@end
- 声明文件
@implementation Square : Rectangle //继承-(void) setSide:(int)s{ [self setWidth: s andHeight: s]; }-(int) side{ return self.width; //执行取值方法width而不是直接获取实例变量width}//side 方法不能直接获取Rectangle的实例变量width(私有的),但是取值方法是继承父类的,获取width的值。@end
3. 给矩形添加原点
XYPoint.h接口文件
#import <Foundation/Foundation.h>@interface XYPoint : NSObject@property int x, y; -(void) setX: (int) xVal andY: (int) yVal;@end
XYPoint.m实现文件
#import "XYPoint.h"@implementation XYPoint@synthesize x, y;-(void) setX:(int)xVal andY:(int)yVal{ x = xVal; y = yVal;}@end
Rectangle.h接口文件
#import <Foundation/Foundation.h>@class XYPoint; //表明 XYPoint是一个类@interface Rectangular : NSObject@property int width, height;-(void) setOrigin: (XYPoint *) pt;-(XYPoint *) origin;-(void) setWidth: (int) w andHeight: (int) h;-(int) area;-(int) perimeter;@end
Rectangle.m实现文件
#import "Rectangular.h"@implementation Rectangular{ XYPoint *origin; //原点}@synthesize width, height;-(void) setWidth:(int)w andHeight:(int)h{ width = w; height = h;}-(int) area{ return width * height;}-(int) perimeter{ return (width + height) * 2;}-(void) setOrigin:(XYPoint *)pt{ origin = pt; //复制指针,不是对象内容}-(XYPoint *) origin{ return origin; //存取方法origin;}@end
测试程序:
#import <Foundation/Foundation.h>#import "Rectangular.h"#import "XYPoint.h"int main(int argc, const char * argv[]) { @autoreleasepool { Rectangular *myRect = [[Rectangular alloc] init]; XYPoint *myPoint = [[XYPoint alloc] init]; [myRect setWidth:5 andHeight:8]; [myPoint setX:100 andY:200]; myRect.origin = myPoint; //复制指针 NSLog(@"Rectangle w = %i, h = %i", myRect.width, myRect.height); NSLog(@"Area = %i, Perimeter = %i", [myRect area], [myRect perimeter]); NSLog(@"Origin is at (%i, %i)", myRect.origin.x, myRect.origin.y); } return 0;
- myPoint 和 pt 同时指向同一地址,若改变myPoint指向的地址中的内容,pt指向的内容也会更改。
解决办法:
-(void) setOrigin:(XYPoint *)pt{ if(!origin)//origin为0时执行 { origin = [[XYPoint alloc] init]; } origin.x = pt.x; origin.y = pt.y; //复制地址内容,而不是地址}
Part2. 覆写方法
覆写:使用和父类相同的名称的方法,相同的返回类型,相同的参数数目。目的可以更改父类方法的定义。
创建子类的原因
- 继承一个类的函数,加入一些新的实例变量和方法。
- 创建一个类的特别版本(图形对象的特定类型)。
- 通过覆写一个或多个方法来改变类的默认行为。
0 0
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第八章 继承
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第四章 数据类型和表达式
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第六章 选择结构
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第七章 类
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十章 变量和数据类型
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十一章 分类和协议
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十二章 预处理程序
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十八章 复制对象
- [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第八章 Foudation Kit 介绍
- Objective-C程序设计第八章----继承
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》开始
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第七章 类 课后题 7-6 解析
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第三章 类,对象和方法
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第四章 数据类型和表达式 课后练习题 4-10
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第五章 循环结构 部分例题&课后题讲解
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第九章 多态,动态类型和动态绑定
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十五章 数字 字符串和集合
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十七章 内存管理和自动计数
- PL/SQL连接Oracle 11g配置使用成功!(64位Oracle使用PL/SQL)
- C语言解决约瑟夫问题算法
- RocketMQ集群配置
- 用SimpleDateFormat格式化日期和时间
- Tomcat服务器常用配置和HTTP简介
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第八章 继承
- Redis初学
- opengl
- Spring boot 部署 mvn clean package
- Entity Framework表名默认自动变为复数形式的解决方法
- java框架有哪些常用框架?
- 有道词典
- GRE写作必备句型
- Qt5.1.1 编译 MySql5.6.17驱动程序的过程和注意事项