2012-06-15 35 views
0

(我认为这是对OOP一个非常基本的问题,但遗憾的是我没能找到它 - 所以,请关闭这个问题,如果它是一个dublicate)我应该继承数组还是声明它是一个成员?

我想创建一个类,主要用途其中一个是另一个类的对象数组的容器。用户应该能够像普通数组一样容易地访问这些对象 - 但是,在数组逻辑之上应该有自定义逻辑。

我应该从头开始创建一个自定义类并使用标准数组类作为成员,还是应该将子类标准数组类并将我的自定义逻辑包含到现有方法的重载以及新的方法中?

(我有客观C的想法,但我不认为它有很多与语言,所以我不包括在标签)。

+0

我标记了这个问题Objective-C,因为它是相当语言特定的。例如,你不能在Java中对数组进行子类化。你不能继承Python列表或PHP数组。在C++中,数组根本不是对象(尽管STL有一个称为向量的动态数组数据结构)。 – paulmelnikow

+0

谢谢。但是,这听起来像它仍然适用于各种语言,不仅Obj-C。 –

回答

2

如果你的课程尊重整个数组接口,无论它在你的上下文中,是的,你可以继承它。如果你的“在数组逻辑之上的自定义逻辑”改变了数组接口的契约,你不应该继承它。

如果您是Array的子​​类,那么您的类可以看作是一个数组。一些不知道你的类的方法可以将它的一个实例视为一个Array。这在多态性中扮演着重要角色。虽然你的类可以有“自定义逻辑”,但Array的接口不能被破坏。

注意:在通用上下文中回答,不针对任何语言,甚至不针对Array类。这对任何允许扩展的类都有效。

1

...但在Objective-C NSArrayNSMutableArray中使用类集群实现。他们不是具体的类,而你可以子类,然后你必须实现自己的存储,并提供自己的实现-count-objectAtIndex:

所以处理像你所描述的情况的首选方式是组合 - 实例变量或属性 - 而不是子类。

如果您需要您的班级响应所有数组方法,您可以使用-forwardInvocation:(如here所述)将消息传递给数组实例。

相关问题