2012-02-24 59 views
1

好吧,这也许是不可能的,但我有一个类(称为CompositeView),这是一个子类UIView。它使用一些核心图形工作来产生基于某些选项的自定义背景。不是一个庞大的班级,而是随着我的要求变化/增加/增加而增长。我遇到的问题是我在很多不同的地方使用这门课。但是在一些地方,我需要它是UIScrollView的一个子类,而不是UIView。有趣的是,我可以简单地改变超类,这一切都很好。但是,我不仅不希望所有的其他观点都成为UIScrollView,还会干扰其中一些观点的运作。所以我需要一个类,有时是UIScrollView的子类,有时候是UIView的子类。子类的UIView VS UIScrollView的

现在,我真的复制了CompositeView的所有接口/实现,将类名更改为CompositeScrollView,并将其继承改为UIScrollView。它工作正常,但现在我有两套完全相同的代码,只是继承了不同的父类。这使得他们两人都感到痛苦。

有没有更好的方式来做到这一点?

+1

为什么你需要它的UIScrollView或UIView的(子类UIScrollView的时候已经是一个子类UIView的)?关于你想要完成的更多细节是需要的。 – 2012-02-24 21:27:20

回答

4

单继承语言强迫你使用授权。您需要将添加的功能分解到您为派生类实例化的单独类中,然后将派生类的转发填充写入实例。这是痛苦的。目标C具有描述添加函数(任何不是覆盖的垫片)的协议,然后如果你没有编写垫片,那么编译器会出错......你仍然必须手动完成。

目标C也有类别,使您可以扩展现有的类,但这些不能被共享(你必须单独扩展每个类),所以它并不能真正帮助。

+0

是的,实际上这可能是迄今为止最好的主意。复合视图实际上使用核心图形来创建一个UIImage,它将其添加到共享缓存(由具有相同选项的所有视图共享)。所有的视图都是在drawInRect中绘制图像。我可能会减轻很多。我会让对象创建更复杂一些,但可能是值得的。 – 2012-02-24 22:42:05

+0

对UIView的一个类别可以工作,实际上,但是他们不允许性质,所以,除非您的附加功能添加任何新的状态(只是行为),你可以不使用它们。 +1! – 2012-02-25 04:34:19

+0

是啊,我也没有想他想添加到所有视图,因此想使用类作为混入被应用到从的UIView和UIScrollView中派生他的课。但是,由于类别本身不能应用于多个类别,因此无法实现(甚至在查看添加的伊娃类别之前)。 – smparkes 2012-02-25 05:41:13

-1

是的,您可能有兴趣使用类群集。这可以产生对象,让我们说MyCompositeClass将产生MyCompositeScrollClass对象或MyCompositeViewClass对象。

苹果使用类簇中的NSArray很多,例如,当你使用它,你的操作不同对象的幕后。不同的是基于阵列的大小,例如对于一些小阵列NSArray将实例化一个专门针对小数据结构的类,等等......

这样做的好处是具有良好的性能和复杂性完全由用户通过这个类集群的概念来隐藏。

我请你阅读一些文件,它可能是更容易理解。 https://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/ClassCluster.html

希望这是有帮助:)

+0

我不知道是谁把-1 ...但是,如果他或她可以详细说说我很想知道是我的错.. – Ganzolo 2012-02-25 11:59:50

1

做的最好的事情是不可能的,当然是:从你UIView子类继承UIScrollView

@smparkes的回答是不错的,但有时你想要的代表团没有做,或者是太不方便了。在这种情况下,它可能是后者。

考虑使用的东西作为UIScrollView无处不在,但打破了你不需要的功能。UIScrollView情况下采取行动酷似UIView实例 - 嗯,他们是UIView实例 - 所以你可能只是解决这个简单的问题,“有一些他们的操作干扰”和你自己的方式。关闭变焦,关闭滚动,等等......

不幸的是,这是单继承语言的现实。无论你做什么,都不要试图用改变isa之类的任何东西来解决这个问题。如果你有任何成功,它将不会持久。 Objective-C只有轻微的动态性,并且不允许普通程序员认真使用这种类型的东西。

+0

+1,这似乎是最明智的事情:) – Julian 2012-02-24 22:06:39

+1

FWIW,我可能会首先尝试禁用所有的'UIScrollView'。这就是说,'UIScrollView'是野兽,我也可能认为值得额外的垫片代码来避免它们,除非我真的需要它们。 – smparkes 2012-02-24 22:17:55

+0

我曾考虑禁用UIScrollView,但事实是,UIScrollView增加了一些我不想要的重量。我最初编写了复合视图来加速一些较慢设备上的动画(它的确行动过)。使用UIScrollView有点失败(不够多,但足够)。 – 2012-02-24 22:35:51

0

好吧,也许这完全是疯狂的,但ISA切换的选项?

object->isa = [SomeClass class]; 

参见:Objective-C: How to change the class of an object at runtime?

如果您实现一个UIView子类是知道如何它的ISA指针切换到UIScrollView的子类,你只需要处理一类,甚至可以动态地决定哪些您在运行时需要的视图。

请注意,这是纯粹的理论。我从来没有使用ISA开关在现场代码,我个人不认为它使一个好的设计:P

编辑: 但同样,它不减少任何裁员...... 我读过更多的进入正题位和它确实似乎没有推荐(老对象的存储结构保持不变,如)

+0

只有当两个类具有相同的内存布局时,才会起作用。不太可能UIView与UIScrollView。 – 2012-02-24 22:10:15

+0

他们不...... UIScrollView在内存上更重。 – 2012-02-24 22:36:33