父母的正确用语是什么?

时间:2009-04-02 19:44:59

标签: objective-c

在Actionscipt中,Parent表示包含实例的对象。因此,如果汽车有一个轮子,轮子可以告诉汽车向前移动

parent.moveForward

然而,在Obj-C中,parent指的是超类(不确定为什么他们有super和parent意思相同的东西)。

我找不到任何与Action-script样式父级相同的东西,但后来我真的不知道该找什么。有没有一种简单的方法在Obj-C中执行此操作,或者在创建实例时是否必须手动传递对实例的引用?我已经尝试了这个并且它引发了一个错误,但由于我是Obj-C的新手,我只是想确保我采取正确的行动方案。

6 个答案:

答案 0 :(得分:6)

有趣......我不知道Actionscript以这种方式使用了“parent”这个词。

这里有两个独立的概念:继承和组合。在Objective-C和许多其他面向对象语言中都使用了术语parent

在Objective-C中,从另一个继承的类将“其他”类称为其祖先。虽然很多人使用术语superclass,但事实上你可以合理地使用parent这个词。顾名思义,这是对象“继承”。

另一方面,对象“组合”就是你用汽车和车轮的例子所描述的。汽车由几个其他物体组成,其中一个或多个物体是轮子。我必须承认,我并没有经常听到在这种情况下使用的术语parent来指代汽车。通常,您可能会发现Objective-C世界中的大多数人都会通过标签“container”识别car。但是,对于像XML文档这样的树型数据结构,我们经常讨论父节点和子节点。父级包含子级,因此在组合关系中使用“父”一词也是适当的,具体取决于关系的类型。我不认为你会发现很多Objective-C程序员在树形结构之外的组合场景中使用“父”字。

这种区别通常被比作“有一个”与“一个”的关系:身份与占有。在继承中,子元素是其父元素的“子类型”。另一方面,在合成中,汽车“有一个”轮子,或树中的父节点“有一个”子节点集合。

编辑:下面的Kendall Helmstetter-Gelner在与实例和传递引用有关的问题上添加了一些好评。如果您有特定的代码块和特定的错误消息,请随时与他们一起更新您的问题,我们会尽力提供帮助。

答案 1 :(得分:4)

继续撰写答案 - 通常的模式是让父母创建或给予它所持有的对象,然后将自己设置为每个人的某种代表(如果他们需要引用父母) - 请注意,委托引用与大多数其他内容不同,几乎从不保留,通常是分配。

所以在你的例子中,父母会告诉每一个轮子:

wheel.carDelegate = self;

然后轮子可以告诉父母:

[carDelegate moveForward];

虽然坦率地说这个例子中的比喻在那里失去了我一点!

另一种方法是更新所包含的obejct中的变量,父对象将以某种方式进行轮询(例如,这种方法可以很好地制作使用导航控制器推送的视图,然后返回主视图必须基于在子视图中进行的更改。)

答案 2 :(得分:3)

由于您所讨论的是直接的Objective-C而不是框架的特定实现(例如Cocoa),因此有很多方法可以实现父子行为。最简单的当然是让你的父类对象有多个实例变量作为子对象。在这种特殊情况下,孩子们都接受initWithParent:initWithCar:等方法。

@interface Car : Object
{
    Wheel[4] wheels;
}

- (void) goFoward:(Wheel *) wheel;

@end

@interface Wheel : Object
{
    Car *parent;
    float tirePressure;
    // etc . . .
}

- initWithCar:(Car *) aCar;

@end

@implementation Car
- init
{
    self = [super init];
    if (!self) return nil;

    unsigned i;
    for (i = 0; i < 4; i++)
        wheels[i] = [[Wheel alloc] initWithCar:self];

    return self;
}

- (void) goForward:
@end

@implementation Wheel
- initWithCar: (Car *) aCar
{
    self = [super init];
    if (!self) return nil;

    parent = aCar;

    return self;
}
@end

答案 3 :(得分:2)

  

不确定为什么他们有超级和父母意味着同样的事情

典型的困惑:)

  • Super是接收器,而不是其类的父级。就像自己接收者的类一样。 self和super之间的区别在于方法查找从哪里开始。

  • Parent是从类到其超类的指针,后面是方法查找。

答案 4 :(得分:1)

这样做并不常见,至少没有明确说明。在Cocoa中,我认为有两种设施取代您正在谈论的功能:

  1. 团。您为方向盘提供了另一个实现某组方法的对象的引用。这可能是对象的所有者,但它可能是其他一些插入到位的对象(非常适合测试)。你可以通过Cocoa框架看到这一切。

  2. 通知。如今,这通常是通过Key-Value Observing完成的。有了这个,对象A(示例中的汽车)注册以在对象B(滚轮)的某个属性发生变化时接收通知。

答案 5 :(得分:1)

研究关键价值观察,或KVO。汽车可以观察车轮的变化并自行更新。

相关问题