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. Anysys Fluent安装教程

    按顺序按照在一个文件夹内D:\Anysys Fluent 1:安装Exceed      调整电脑时间至2005年(前辈经验)      点击解压好的Exceed.13.[x86+x64]文件夹中的M ...

  2. I-MooFest(POJ 1990)

    MooFest Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5697   Accepted: 2481 Descripti ...

  3. 40免费的 jQuery & CSS3 图片热点特效

    jQuery CSS3 形象悬停效果可能是一个优秀的网站项目中添加的效果.这个特殊的收集是大约50个 jQuery CSS3 形象徘徊影响最近出版的.这些图像悬停效果可以作为一个有效的和创造性的方式添 ...

  4. MYSQL 日期函数【转】

    MySQL日期时间函数大全 DAYOFWEEK(date) 返回日期date是星期几(=星期六,ODBC标准) mysql> select DAYOFWEEK('1998-02-03'); WE ...

  5. redhat enterprixe 5.0 下DHCP服务器rpm安装配置及其测试

    一.了解DHCP DHCP服务提供动态指定IP地址和配置参数的机制.有动态和静态两种方式. 二.rpm安装 因为配过Samba,所以感觉挺简单. 首先找到主程序和几个附属程序的rpm的安装包.应该都是 ...

  6. Spring mvc中使用request和response

    @ResponseBody @RequestMapping(value="/ip", method=RequestMethod.GET) public String getIP(H ...

  7. cf卡中,wtmp文件较大,导致磁盘空间满了

    看了一下,有一个wtmp 和wtmp.1的文件非常大.wtmp记录的是机器注销.启动的信息.由此可见,机器长时间的不断重启,造成该日志记录超级大,把cf的空间给占满了. wtmp日志可以用who和la ...

  8. PostgreSQL数据库系统优点

    PostgreSQL 是世界上可以获得的最先进的开放源码的数据库系统, 它提供了多版本并行控制,支持几乎所有 SQL 构件(包括子查询,事务和用户定 义类型和函数), 并且可以获得非常广阔范围的(开发 ...

  9. android 计算器的实现(转)

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  10. c++ 普通高精乘

    //第一次提交全错了,太过相信自己了. //给我教训是注意循环后变量的值,和pascal不一样. //就不贴错误代码了. //codevs3118 高精度练习之除法 #include<cstdi ...