1 重构Point2类

1.1 问题

本案例使用初始化方法重构Point2类,类中有横坐标x、纵坐标y两个属性,并且有一个能显示位置show方法。在主程序中创建两个Point2类的对象,设置其横纵坐标,并将它们显示出来。

1.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:定义类Point2

由于是对Point2类的重构,所以在Day02工程中新添加Point2.h文件用于定义新的类Point2。

代码如下所示:

 
  1. @interface Point2 : NSObject
  2. {
  3. }
  4. @end

步骤二:在Point2类中添加属性

在Point2类中添加两个属性,它们为横坐标x,为纵坐标y。

 
  1. #import <Foundation/Foundation.h>
  2. @interface Point2 : NSObject
  3. {
  4. }
  5. @property int x, y;
  6. @end

步骤三:在Point2类中添加初始化方法

首先,在类Point2的声明中添加无参初始化方法和有参初始化方法的声明。

代码如下所示:

  1. #import <Foundation/Foundation.h>
  2. @interface Point2 : NSObject
  3. {
  4. }
  5. @property int x, y;
  6. -(id)init;
  7. -(id)initWithX:(int)x andY:(int)y;
  8. @end

上述代码中,以下代码:

  1. -(id)init;

是无参初始化方法,该方法返回一个id类型的变量。id类型是Objective-C中的一种万能指针,相当于C语言中的void*这种数据类型。

上述代码中,以下代码:

  1. -(id)initWithX:(int)x andY:(int)y;

是有参初始化方法,该方法返回一个id类型的变量,同时具有两个形参,一个是整型变量x,另一个是整型变量y。

然后,在类Point2的实现部分,即在Point2.m文件中,添加无参初始化方法和有参初始化方法的实现。

代码如下所示:

  1. #import "Point2.h"
  2. @implementation Point2
  3. -(id)init
  4. {
  5. if (self = [super init])
  6. {
  7. _x = 10;
  8. _y = 20;
  9. }
  10. return self;
  11. }
  12. -(id)initWithX:(int)x andY:(int)y
  13. {
  14. if (self = [super init])
  15. {
  16. _x = x;
  17. _y = y;
  18. }
  19. return self;
  20. }
  21. @end

上述代码中,以下代码:

  1. if (self = [super init])

是首先发消息[super init]调用基类中的init方法获得self值。

步骤四:在Point2类中添加show方法

show方法用于在控制台上显示Point2类中的两个实例变量的值。

首先,在类Point2的声明中添加show方法的声明。

代码如下所示:

  1. #import <Foundation/Foundation.h>
  2. @interface Point2 : NSObject
  3. {
  4. }
  5. @property int x, y;
  6. -(id)init;
  7. -(id)initWithX:(int)x andY:(int)y;
  8. -(void)show;
  9. @end

然后,在类Point2的实现部分,即在Point2.m文件中,添加show方法的实现。

代码如下所示:

  1. #import "Point2.h"
  2. @implementation Point2
  3. -(id)init
  4. {
  5. if (self = [super init])
  6. {
  7. _x = 10;
  8. _y = 20;
  9. }
  10. return self;
  11. }
  12. -(id)initWithX:(int)x andY:(int)y
  13. {
  14. if (self = [super init])
  15. {
  16. _x = x;
  17. _y = y;
  18. }
  19. return self;
  20. }
  21. -(void)show
  22. {
  23. NSLog(@"x=%d,y=%d", _x, _y);
  24. }
  25. @end

步骤五:在主程序中使用Point2类

首先在Day02工程中新添加Point2Main.m文件,用于存储主程序,在主程序中定义两个Point2类的对象,同时使用无参初始化方法和有参初始化方法对两个对象的横坐标和纵坐标赋初值,最后打印这两个对象。

  1. #import "Point2.h"
  2. int main(int argc, const char * argv[])
  3. {
  4. @autoreleasepool {
  5. // insert code here...
  6. Point2 *p = [[Point2 alloc] init];
  7. [p show];
  8. Point2 *p1 = [[Point2 alloc] initWithX:55 andY:77];
  9. [p1 show];
  10. }
  11. return 0;
  12. }

1.3 完整代码

本案例中,类Point2声明,即Point2.h文件,完整代码如下所示:

  1. #import <Foundation/Foundation.h>
  2. @interface Point2 : NSObject
  3. {
  4. }
  5. @property int x, y;
  6. -(id)init;
  7. -(id)initWithX:(int)x andY:(int)y;
  8. -(void)show;
  9. @end

类Point2实现,即Point2.m文件,完整代码如下所示:

  1. #import "Point2.h"
  2. @implementation Point2
  3. -(id)init
  4. {
  5. if (self = [super init])
  6. {
  7. _x = 10;
  8. _y = 20;
  9. }
  10. return self;
  11. }
  12. -(id)initWithX:(int)x andY:(int)y
  13. {
  14. if (self = [super init])
  15. {
  16. _x = x;
  17. _y = y;
  18. }
  19. return self;
  20. }
  21. -(void)show
  22. {
  23. NSLog(@"x=%d,y=%d", _x, _y);
  24. }
  25. @end

主程序,即Point2Main.m,完整代码如下所示:

  1. #import "Point2.h"
  2. int main(int argc, const char * argv[])
  3. {
  4. @autoreleasepool {
  5. // insert code here...
  6. Point2 *p = [[Point2 alloc] init];
  7. [p show];
  8. Point2 *p1 = [[Point2 alloc] initWithX:55 andY:77];
  9. [p1 show];
  10. }
  11. return 0;
  12. }

2 重构Point2类

2.1 问题

本案例使用工厂方法重构Point2类,类中有横坐标x、纵坐标y两个属性,并且有一个能显示位置show方法。在主程序中创建两个Point2类的对象,设置其横纵坐标,并将它们显示出来。

2.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:定义类Point2

由于是对Point2类的重构,所以在Day02工程中新添加Point3.h文件用于定义新的类Point2。

代码如下所示:

  1. @interface Point2 : NSObject
  2. {
  3. }
  4. @end

步骤二:在Point2类中添加属性、初始化方法和show方法

首先,在类Point2的声明中添加两个属性,同时再添加无参初始化方法和有参初始化方法的声明和添加show方法的声明。

代码如下所示:

  1. #import <Foundation/Foundation.h>
  2. @interface Point2 : NSObject
  3. {
  4. }
  5. @property int x, y;
  6. -(id)init;
  7. -(id)initWithX:(int)x andY:(int)y;
  8. -(void)show;
  9. @end

然后,在类Point2的实现部分,即在Point3.m文件中,添加无参初始化方法、有参初始化方法和show方法的实现。

  1. #import "Point3.h"
  2. @implementation Point2
  3. -(id)init
  4. {
  5. if (self = [super init])
  6. {
  7. _x = 10;
  8. _y = 20;
  9. }
  10. return self;
  11. }
  12. -(id)initWithX:(int)x andY:(int)y
  13. {
  14. if (self = [super init])
  15. {
  16. _x = x;
  17. _y = y;
  18. }
  19. return self;
  20. }
  21. -(void)show
  22. {
  23. NSLog(@"x=%d,y=%d", _x, _y);
  24. }
  25. @end

步骤三:在Point2类中添加工厂方法的声明

工厂方法本质上是类的静态方法,其调用是通过类名直接调用的,与实例方法不同,实例方法是通过对象来调用的。

首先,在类Point2的声明中添加无参工厂方法和有参工厂方法的声明。

代码如下所示:

  1. #import <Foundation/Foundation.h>
  2. @interface Point2 : NSObject
  3. {
  4. }
  5. @property int x, y;
  6. -(id)init;
  7. -(id)initWithX:(int)x andY:(int)y;
  8. +(id)created;
  9. +(id)createdWithX:(int)x andY:(int)y;
  10. -(void)show;
  11. @end

上述代码中,以下代码:

  1. +(id)created;
  2. +(id)createdWithX:(int)x andY:(int)y;

用于对工厂方法的声明,需要注意的是工厂方法以加号“+”开头,而实例方法则以减号“-”开头。

然后,在类Point2的实现部分,即在Point3.m文件中,添加无参工厂方法和有参工厂方法的实现。方法的函数体实际上就是创建一个对象,然后将其返回。

代码如下所示:

  1. #import "Point3.h"
  2. @implementation Point2
  3. -(id)init
  4. {
  5. if (self = [super init])
  6. {
  7. _x = 10;
  8. _y = 20;
  9. }
  10. return self;
  11. }
  12. -(id)initWithX:(int)x andY:(int)y
  13. {
  14. if (self = [super init])
  15. {
  16. _x = x;
  17. _y = y;
  18. }
  19. return self;
  20. }
  21. +(id)created
  22. {
  23. Point2 *p = [[Point2 alloc] init];
  24. return p;
  25. }
  26. +(id)createdWithX:(int)x andY:(int)y
  27. {
  28. Point2 *p = [[Point2 alloc] initWithX:x andY:y];
  29. return p;
  30. }
  31. -(void)show
  32. {
  33. NSLog(@"x=%d,y=%d", _x, _y);
  34. }
  35. @end

步骤四:在主程序中使用Point2类

首先在Day02工程中新添加Point3Main.m文件,用于存储主程序,在主程序中创建两个Point2类的对象,一个用无参工厂方法创建,另一个用有参工厂方法创建,最后打印这两个对象。

代码如下所示:

  1. #import "Point3.h"
  2. int main(int argc, const char * argv[])
  3. {
  4. @autoreleasepool {
  5. // insert code here...
  6. Point2 *p = [Point2 created];
  7. [p show];
  8. Point2 *p1 = [Point2 createdWithX:55 andY:77];
  9. [p1 show];
  10. }
  11. return 0;
  12. }

2.3 完整代码

本案例中,类Point2声明,即Point3.h文件,完整代码如下所示:

  1. #import <Foundation/Foundation.h>
  2. @interface Point2 : NSObject
  3. {
  4. }
  5. @property int x, y;
  6. -(id)init;
  7. -(id)initWithX:(int)x andY:(int)y;
  8. +(id)created;
  9. +(id)createdWithX:(int)x andY:(int)y;
  10. -(void)show;
  11. @end

类Point2实现,即Point3.m文件,完整代码如下所示:

  1. #import "Point3.h"
  2. @implementation Point2
  3. -(id)init
  4. {
  5. if (self = [super init])
  6. {
  7. _x = 10;
  8. _y = 20;
  9. }
  10. return self;
  11. }
  12. -(id)initWithX:(int)x andY:(int)y
  13. {
  14. if (self = [super init])
  15. {
  16. _x = x;
  17. _y = y;
  18. }
  19. return self;
  20. }
  21. +(id)created
  22. {
  23. Point2 *p = [[Point2 alloc] init];
  24. return p;
  25. }
  26. +(id)createdWithX:(int)x andY:(int)y
  27. {
  28. Point2 *p = [[Point2 alloc] initWithX:x andY:y];
  29. return p;
  30. }
  31. -(void)show
  32. {
  33. NSLog(@"x=%d,y=%d", _x, _y);
  34. }
  35. @end

主程序,即Point3Main.m,完整代码如下所示:

  1. #import "Point3.h"
  2. int main(int argc, const char * argv[])
  3. {
  4. @autoreleasepool {
  5. // insert code here...
  6. Point2 *p = [Point2 created];
  7. [p show];
  8. Point2 *p1 = [Point2 createdWithX:55 andY:77];
  9. [p1 show];
  10. }
  11. return 0;
  12. }

Objective-C对象初始化 、 实例方法和参数 、 类方法 、 工厂方法 、 单例模式的更多相关文章

  1. Python32之类和对象2(self参数及魔法方法)

    一.类方法中的self参数含义 在Python中类的方法都要有self参数,其实质为对类的实例化对象的绑定从而使得在类的实例化对象调用方法时能够确认出是对哪个对象进行操作. 带self的的参数是人家实 ...

  2. 对象初始化的完整过程(C#)

    1.静态构造函数 在引入本文的主题之前,我们先来铺垫一下吧,看看静态构造函数的概念及用途. C#中允许创建无参数构造函数,该函数仅执行一次.它一般被用来初始化静态字段.CLR不能保证在某个特定时刻执行 ...

  3. python__高级 : 动态添加 对象属性, 类属性, 对象实例方法, 类静态方法, 类方法

    给对象添加实例属性,可以直接这样  t.age = 18   ( 假设 t = Test() )  给类添加类属性 , 也可以直接这样  Test.age = 18 那给对象添加实例方法,可以在类外面 ...

  4. Objective -C Object initialization 对象初始化

    Objective -C Object initialization 对象初始化 1.1 Allocating Objects  分配对象 Allocation is the process by w ...

  5. C#语法糖之第二篇: 参数默认值和命名参数 对象初始化器与集合初始化器

    今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完 ...

  6. 第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)

    一. 语法糖简介   语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方 ...

  7. jQuery对象初始化的多种传参数形式

    jQuery对象初始化的传参方式包括:1.$(DOMElement)2.$('<h1>...</h1>'), $('#id'), $('.class') 传入字符串, 这是最常 ...

  8. {{jQuery源码分析}}jQuery对象初始化的多种传参数形式

    jQuery对象初始化的传参方式包括:1.$(DOMElement)2.$('<h1>...</h1>'), $('#id'), $('.class') 传入字符串, 这是最常 ...

  9. python-面向对象-09_类属性和类方法

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

随机推荐

  1. 采用SHELL,通过SQL LOAD导入一定格式的txt文件至数据库中

    1. 准备工作,window中可直接通过sqlload直接导入文件,linux下,需要有sqlload的相关软件. 2. SQL脚本(MID_DFDZ.ctl) LOAD DATA INTO TABL ...

  2. Jsp开发自定义标签,自定义标签将字符串转成指定的时间格式显示

    本例以将 字符串格式的时间转成指定的时间格式显示. 第一步.定义一个标签处理程序类,需要集成javax.servlet.jsp.tagext.TagSupport,代码如下: import java. ...

  3. oracle表分区【转】

          摘要:在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用. 在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以达到几十 ...

  4. POJ 3249 拓扑排序+DP

    貌似是道水题.TLE了几次.把所有的输入输出改成scanf 和 printf ,有吧队列改成了数组模拟.然后就AC 了.2333333.... Description: MR.DOG 在找工作的过程中 ...

  5. java 面向对象编程 第20章 XML技术解析

    1.  XML:extended Markup Language  可扩展标记语言,利用标签和子标签方式描述数据. 2.  声明<?xml version=”1.0”?>版本号 注释< ...

  6. 一模 (4) day2

    第一题: 题目大意:二进制数 n mod m 的结果是多少?  n 的长度(二进制数的位数)<=200 000:  m 的长度(二进制数的位数)<=20. 解题过程: 1.我的算法是直接高 ...

  7. RM报表预览,只有固定的1个订单页面

    明明选了多个记录,预览时,只显示最后一个. 原因: 主项数据的数据集选了报表自带的虚拟数据集了.

  8. JSP初识

    JSP最终会变成一个完整的servlet在web应用中运行.它与其他的servlet非常相似,只不过这个servlet类会由容器编写. 1.JSP的生命周期 如果一个web应用包含JSP,部署这个应用 ...

  9. plist 和 Xib

    plist文件 mainbudin加载时候有后缀 xib文件  mainbudin加载时候无需后缀

  10. 本节向大家介绍一下UML建模误区

    本节向大家介绍一下UML建模误区,这里向大家介绍九个误区,希望通过本节的学习,你对UML建模有清晰的认识,以免在以后使用过程中产生不必要的麻烦.下面让我们一起来看一下这些建模误区吧. UML建模误区 ...