Objective c 什么';“父母”这个词合适吗?

Objective c 什么';“父母”这个词合适吗?,objective-c,Objective C,在Actionscipt中,父对象是指包含实例的对象。所以,如果一辆汽车有轮子,轮子可以告诉汽车前进 父。向前移动 然而,在Obj-C中,parent指的是super类(不确定为什么它们有super和parent的意思相同) 我找不到任何与动作脚本风格的父级类似的东西,但我真的不知道该找什么。在Obj-C中有没有一种简单的方法可以做到这一点,或者在创建实例时必须手动传递对实例的引用?我尝试过这个,但它抛出了一个错误,但由于我是Obj-C的新手,我只想确保我采取了正确的行动路线。有趣。。。我不知道

在Actionscipt中,父对象是指包含实例的对象。所以,如果一辆汽车有轮子,轮子可以告诉汽车前进

父。向前移动

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


我找不到任何与动作脚本风格的父级类似的东西,但我真的不知道该找什么。在Obj-C中有没有一种简单的方法可以做到这一点,或者在创建实例时必须手动传递对实例的引用?我尝试过这个,但它抛出了一个错误,但由于我是Obj-C的新手,我只想确保我采取了正确的行动路线。

有趣。。。我不知道Actionscript用了“家长”这个词

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

在Objective-C中,从其他类继承的类将该“其他”类称为其祖先。虽然许多人使用术语
超类
,但事实上,您可以非常合理地使用单词
parent
。顾名思义,这就是对象“继承”

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

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


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

按照合成答案-通常的模式是让父对象创建或被赋予它所持有的对象,然后将自己设置为每个对象的某种委托(如果它们需要引用父对象)-请注意,委托引用与大多数其他事物不同,几乎从不保留,通常是指定的

因此,在您的示例中,家长会告诉每个轮子:

wheel.carDelegate = self;
然后轮子可以告诉父母:

[carDelegate moveForward];
尽管坦率地说,这个例子中的比喻让我有点不知所措


另一种方法是更新包含的OBEJCT中的变量,父对象会以某种方式轮询这些变量(例如,这种方法可以很好地生成使用导航控制器推送的视图,然后返回主视图必须根据子视图中所做的更改来执行某些操作的位置)。

这样做并不常见,至少不明确。在Cocoa中,我认为有两种功能可以取代您所说的功能:

  • 代表团。您为控制盘提供了对实现特定方法集的另一个对象的引用。这可能是该对象的所有者,但也可能是其他某个在适当位置开槽的对象(非常适合测试)。您可以通过Cocoa框架看到这一点

  • 通知。现在,这是最常见的通过。这样,当对象B(车轮)的某个属性发生变化时,对象A(示例中的汽车)注册以接收通知


  • 研究关键值观察,或。汽车可以观察方向盘的变化并进行自我更新。

    因为您谈论的是直接目标-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
    
    @接口车:对象
    {
    轮子[4]个轮子;
    }
    -(无效)goFoward:(车轮*)车轮;
    @结束
    @接口控制盘:对象
    {
    汽车*家长;
    浮动轮胎压力;
    //等等。
    }
    -initWithCar:(Car*)aCar;
    @结束
    @实施车
    -初始化
    {
    self=[super init];
    如果(!self)返回nil;
    未签名的i;
    对于(i=0;i<4;i++)
    车轮[i]=[[Wheel alloc]initWithCar:self];
    回归自我;
    }
    -(无效)前进:
    @结束
    @执行轮
    -initWithCar:(Car*)aCar
    {
    self=[super init];
    如果(!self)返回nil;
    父母=aCar;
    回归自我;
    }
    @结束
    
    不知道为什么他们有“超级”和“父母”的意思是一样的

    典型的困惑:)

    • Super是接收方,而不是其类的父级。就像赛尔夫不是接受者的职业一样。self和super的区别在于方法查找的起点

    • 父类是从类到其超类的指针,方法查找遵循该指针


    感谢您在引用传递时添加位。Objective-C中没有定义良好的“包含”概念(对象不包含其他对象,只包含其指针)。如果你想要一个“父”指针,你必须自己维护它。