我应该将数组子类化还是将其声明为成员?

时间:2012-06-15 00:05:36

标签: objective-c arrays oop subclass

(我认为这是关于OOP的一个非常基本的问题,但不幸的是我无法找到它 - 所以,请关闭这个问题,如果它是一个公共的。)

我想创建一个类,其主要目的是成为另一个类的对象数组的容器。用户应该能够非常容易地访问这些对象,作为常规数组 - 但是,应该在数组逻辑之上存在自定义逻辑。

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

(我考虑过目标C,但我认为它与语言有很多关系,因此我没有包含在标签中)。

2 个答案:

答案 0 :(得分:2)

如果你的类尊重整个数组接口,无论它在你的上下文中是什么,是的,你可以继承它。如果您的"自定义逻辑位于数组逻辑之上"改变了数组接口的契约,你不应该对它进行子类化。

如果您是Array的子​​类,则可以将您的类视为数组。一些不了解你的类的方法可以将它的实例视为一个数组。这在多态性中起作用。虽然你的班级可以拥有"自定义逻辑"但是阵列的界面不能被破坏。

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

答案 1 :(得分:1)

...但在Objective-C NSArrayNSMutableArray中使用类集群实现。它们不是具体的类,当你可以对它们进行子类化时,你必须实现自己的存储并为-count-objectAtIndex:提供自己的实现。

因此,处理类似情况的首选方法是组合 - 实例变量或属性 - 而不是子类化。

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