3

我非常喜欢代码生成(来自 UML)并且来自 Java 世界,我想知道如何在 Objective-C 中实现自动双向关联管理。

图像关联合作伙伴 <-> 地址,一对多且可从两端导航。我想要实现的是,如果我将地址附加到合作伙伴,地址对象应该自动知道它的合作伙伴。

所以实现模式是在 Partner 端有一个 NSMutableArray*,在 Address 端有一个 Partner*。Address 端的属性很容易实现,因为 setPartner:(Partner*)aPartner 可以自动将 Address (self) 插入到管理地址的 Partner 的 NSMutableArray 中。然而,另一方面,实现起来并不容易。Objective-C 中多引用的标准实现模式似乎是可通过 @property 的 get 方法获得的 NSMutableArray。然后拥有这个 NSMutableArray 的对象可以将 Address 对象插入到数组中,这当然不会更新另一端。

我知道这种关联管理还有其他模式,例如,通过 addTo...() 和 removeFrom...() 方法。但我还不知道这是否符合 Cocoa 编程的其他原则,甚至会阻止我有效地使用 Cocoa。我在这里考虑界面生成器。没有太多经验,但我见过一个叫做 ArrayController 的东西,它看起来很方便,但似乎也期望 NSMutableArray 类型的属性可以使用。如果这个人将对象插入到数组中,我需要拦截它并进行另一侧调整。

作为一名 Java 程序员,我现在倾向于继承 NSMutableArray 并覆盖它的一些方法,然后这些方法可以操纵另一端。这可能吗?我阅读了有关类别的内容,但到目前为止,我了解到我只能以这种方式方法添加到类中,而不能覆盖它们,也不能添加到它的结构中。还是应该是方法转发?我现在很困惑。如果你能指出我正确的思考方向,那就太好了。非常感谢!

4

1 回答 1

9

欢迎来到可可。不要子类化内置集合。你会发疯的。

请允许我澄清一下:在 Cocoa 中,我们有这些称为“类簇”的东西。集群是私有类的层次结构,它们都有一个公共的公共超类。在这种情况下,NSArray是公共超类,并且有一些私有子类是实际的数组实现。这在子类化时提出了一个非常困难的挑战,因为您不知道需要子类化哪个(或哪些类)。

常见的解决方法是创建一个NSObject“包装” an 的新子类NSArray(即,它将数组作为实例变量 [“field”]),然后调用自定义包装器上的方法,包装器保存所有您需要的自定义逻辑。

As to answer your question, I've found that when I have this sort of set up where I need to maintain one-to-one, one-to-many, or many-to-many relationships automatically, there's nothing that beats using CoreData. CoreData is a built-in framework that's more or less like an object store. One of the truly awesome things that it does is handle relationship integrity, which is what you're looking for.

于 2010-07-06T22:24:03.290 回答