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. JQuery时间轴timeline插件的学习-Lateral On-Scroll Sliding with jQuery+technotarek / timeliner

    一.Lateral On-Scroll Sliding with jQuery的使用 View demo      Download source 1. HTML结构 <div id=" ...

  2. jQuery修改后代、兄弟样式

    <div> <div >1</div> <div class="one"> 2 <div>2_1 <div> ...

  3. loadrunner 参数化数据更新方式

    数据分配方式: Select next row[选择下一行]: 顺序(Sequential):按照参数化的数据顺序,一个一个的来取. 随机(Random):参数化中的数据,每次随机的从中抽取数据. 唯 ...

  4. getParamValues()

    http://blog.csdn.net/msg_java2011/article/details/6529226

  5. 迭代输出Map和List<Map<String,Object>>的方法

    一.Map<String,Object> String:key的类型 Object:value的类型,value可能是String,或者int类型,什么类型都可以 对于Map接口来说,本身 ...

  6. dos.orm学习地址

    os.ORM(原Hxj.Data)于2009年发布.2015年正式开源,该组件已在数百个成熟项目中应用,是目前国内.Net用户量最多.最活跃.最完善的国产ORM.初期开发过程参考了NBear与MySo ...

  7. USB鼠标按键驱动

    现象:把USB设备接到PC 1. 右下角弹出"发现android phone" 2. 跳出一个对话框,提示你安装驱动程序 问1. 既然还没有"驱动程序",为何能 ...

  8. sqlite3 SQL常用语句

    1. select SELECT LastName,FirstName FROM Persons; SELECT * FROM Persons; 2. where SELECT * FROM Pers ...

  9. Cocoapods的安装与使用

    一.安装 1.CocoaPods是用Ruby实现的,要想使用它首先需要有Ruby的环境.OS X系统默认已经可以运行Ruby了,因此我们只需执行以下命令: sudo gem install cocoa ...

  10. Codeforces Round #326 (Div. 2)-Duff in Love

    题意: 一个数x被定义为lovely number需要满足这样的条件:不存在一个数a(a>1),使得a的完全平方是x的因子(即x % a2  != 0). 给你一个数n,求出n的因子中为love ...