拥有对象的类

时间:2015-11-22 10:09:04

标签: objective-c oop object inheritance

问题:      我知道origin是Rectangle类的实例变量,它具有XYPoint类型。 origin实例变量有两个其他实例变量x和y。我不清楚,矩形类中的if语句有什么作用?

我认为if(!origin)意味着如果原点不等于零,则执行以下操作......原点是否等于零?如果是,它如何等于零,以及如何在if(!origin)语句中验证它。换句话说,if(!origin)语句有什么作用?

是否存在原点等于零的实例?如果发生这种情况,我的代码将如何响应?我知道如果没有if语句,myPoint对象将不会保留其初始值。

我还想知道为什么我们在矩形类中使用了class指令而不是导入。它有什么不同。我还注意到我们没有在矩形的实现中导入XYPoint标头。如果有人愿意提供帮助,我将非常感激。非常感谢提前。

注意:请查看下面的代码。

*      XYPoint类

 #import <Foundation / Foundation.h>

 @interface XYPoint: NSObject

 @property int x, y;

 -(void) setX: (int) Xval andY: (int) yVal;
 @end
 #import "XYPoint.h"

 @implementation  XYPoint

 @synthesize x, y;

 -(void) setX: (int) Xval andY: (int) yVal
  { x = xVal;
    y = yVal;
  }
  @end

*     矩形类

#import <Foundation/Foundation.h>

@class XYPoint;
@interface Rectangle: NSObject

-(XYPoint *) origin;
-(void) setOrigin: (XYPoint *) pt;
@end
#import "Rectangle.h"

@implementation Rectangle
{ 
 XYPoint *origin
}

 -(void) SetOrigin: (XYPoint *) pt
{
 if (! origin)
 origin = [[XYPoint alloc]init];
 origin.x = pt.x;
 origin.y = pt.y;
}

-(XYPoint *) origin
{
  return origin;
}
@end
Main

#import "Rectangle.h"
#import "XYPoint.h"

int main (int argc, char *argv[])
{
  @autoreleasepool {
  XYPoint *myPoint = [[XYPoint alloc]init];

  [myPoint setX: 100 andY: 200];
  myRect.origin = myPoint;

  NSLog (@"Origin at (%i, %i)" , myRect.origin.x, myRect.origin.y); 

  [myPoint setX: 50 andY: 75];

  NSLog (@"Origin at (%i, %i)" , myRect.origin.x, myRect.origin.y);
}
@end
Origin at (100, 200)
Origin at (100, 200)

2 个答案:

答案 0 :(得分:1)

定义实例变量会创建一个可用于引用实例的指针。它不会为您创建实例。所以,最初没有起源。

if语句检查源是否存在,如果不存在,则创建一个新的,然后代码复制参数中传递的值。

除此之外:理想情况下,点类将是不可变的并实现复制,因此不必重复创建新实例并更新它们,您只需复制传递的参数即可。复制在不可变类中不会做任何事情(返回self),并且只支持将来添加可变类。

答案 1 :(得分:0)

声明时,对象实例变量设置为nil,就C / Objective-C而言为零。

要使用对象,必须对其进行初始化。这就是if语句检查和执行的操作

if (! origin) // alternative syntax if (origin == nil)
  origin = [[XYPoint alloc] init];

装置

  

如果对象nil初始化它。如果没有跳过该行。

当代码中仅提及类的类型且不需要头文件时,使用class指令而不是import语句。 在代码中,如果类是用单独的文件编写的,则需要import语句。

PS:您的代码中存在一些小写/大写错别字,并且缺少分号。