1-定义XYPoint接口文件
#import <Foundation/Foundation.h> @interface XYpoint : NSObject @property int x,y; -(void) setX:(int)xVal andY:(int) yVal; @end
2-XYpoint实现代码
#import "XYpoint.h" @implementation XYpoint @synthesize x,y; -(void) setX:(int)xVal andY:(int)yVal { x = xVal; y = yVal; } @end
3-rectangl类接口代码
#import <Foundation/Foundation.h> @class XYpoint; @interface Rectangl : NSObject @property int width,height; -(XYpoint *) origin; -(void) setOrigin:(XYpoint *) pt; -(void) setWidth:(int)w andHeight:(int)y; -(int) area; -(int) perimeter; @end
4-rectangl实现代码
#import "Rectangl.h" #import "XYpoint.h" @implementation Rectangl { XYpoint *origin; } @synthesize width,height; -(void) setWidth:(int)w andHeight:(int)y { width = w; height = y; } -(void) setOrigin:(XYpoint *)pt { origin = pt; } -(int) area { return width*height; } -(int) perimeter { return (width+height)*2; } -(XYpoint *) origin { return origin; } @end
5-主函数
#import <Foundation/Foundation.h> #import "XYpoint.h" #import "Rectangl.h" int main(int argc, const char * argv[]) { @autoreleasepool { Rectangl *myrect = [[Rectangl alloc]init]; XYpoint *myPoint = [[XYpoint alloc]init]; [myPoint setX:100 andY:200]; [myrect setWidth:5 andHeight:8]; //myrect.origin = myPoint; [myrect setOrigin:myPoint]; //NSLog(@"myrect width = %i,height = %i",myrect.width,myrect.height); NSLog(@"myrect width = %i,height = %i",[myrect width],myrect.height); NSLog(@"origin at (%i,%i)",myrect.origin.x,myrect.origin.y); //注释[1] NSLog(@"area = %i,perimeter = %i",[myrect area],[myrect perimeter]); } return 0; }
---分割线--- //
以下123是本人一开始的疑惑。
1、rectangl接口文件中定义了setorigin方法,主函数中为什么没有用到?
2、经过测试,在主函数中myrect.origin = myPoint;作用等同与[myrect setOrigin:myPoint]; 为什么?本人觉得
使用[myrect setOrigin:myPoint];这种书写方式是更好的,原因是可以很直观的看到这是一个方法的调用。
3、在rectangl实现代码中,定义了
-(XYpoint *) origin
{
return origin;
} 这个方法,这个方法的作用是什么呢?是在主函数中 注释1 哪个地方使用的么?为了使用对象mypoint中的私有参数?
[myrect setOrigin:myPoint]方法不是已经把 对象mypoint赋予了rectangl类中的变量origin了么?
-分割线
以上是本人一开始的疑惑,通过测试本人发现oc对变量对赋值和调用对模式,不知道对不对。以下是本人想法。
1、在类中,当定义类一个变量时,如@property int x; 系统自动会生成一个-(void) setx:(int) xVal 的方法,这个
方法是自动的,不需要在类的实现代码中手写;在主函数中可以直接使用 ;但是假如在类中使用另外一个类(暂时这样说);那么就
必须手写一个 -(void) setFuncName:(FuncNmae *) value ; 的这样一个方法,系统不会像变量那样自动生成。
而且这个方法的调用,跟本文主函数中那样,myrect.origin = myPoint 其实等同与 [myrect setOrigin:myPoint];
2、第二个是关于在主函数中使用类的变量的问题。也是关于本人对本人刚开始疑惑(上面问题3)对思考。
oc在类对接口文件中定义了一个变量x,@property int x; 第一系统自动定义了一个 -(void) setx:(int)xVal;对赋值方法。
同时也自动定义了一个 -(int) x { return x}; 对方法。这辆个方法都不需要手工写(不使用@property这个方式定义变量的应该还是要手工写的吧?)
我们在主函数中通过 调用-(void) setx:(int)x 方法,对类变量x赋值了;
那么在使用的时候,nslog(@”x = %i”,myrect.x);其实等同于nslog(@”x = %i”,[myrect x]);myrect.x 其实就是调用了方法,对不对?
那么回到我们本次的代码,本人在rectangl类中使用xypoint类,就必须手写一个返回方法,才能在主函数中使用对象mypoint的变量x,对么?
本人又测试了一个,rectangl类的实现代码中,方法 origin不能改名,必须要和 XYpoint *origin;定义的对象名origin一样么?
http://justcoding.iteye.com/blog/1444548