好的,这可能是不可能的,但我有一个类(CompositeView
),它是一个子类UIView
。它使用一些核心图形工作来根据某些选项生成自定义背景。不是一个庞大的阶级,但随着我的需求变化/增加/无论如何必然会增长。我遇到的问题是我在很多不同的地方经常使用这个课程。但在一些地方我需要它成为UIScrollView
的子类而不是UIView
。有趣的是,我可以简单地改变超类,它一切都很好。但是,我不仅不希望我的所有其他视图都是UIScrollView
,而且还会干扰其中一些视图的操作。所以我需要一个有时是UIScrollView
的子类的类,有时候是UIView
的子类。
目前,我已经完全复制了CompositeView
的所有接口/实现,将类名更改为CompositeScrollView
,并将其继承更改为UIScrollView
。它工作正常,但现在我有两组完全相同的代码,只是继承自不同的父类。这使他们保持最新的痛苦。
有更好的方法吗?
答案 0 :(得分:4)
单继承语言强制您使用委托。您将添加的功能分解为一个单独的类,您可以为派生类实例化,然后将派生类中的转发填充程序写入实例。这很痛苦。
目标C有协议可以描述添加的函数(任何不覆盖的填充程序),如果你没有编写填充程序,编译器就会出错...你还需要手动完成。
目标C还有一些类别,允许您扩展现有的类,但这些类不能共享(您必须单独扩展每个类),因此它并没有真正的帮助。
答案 1 :(得分:1)
当然,最好的办法是不可能的:从你的UIScrollView
子类继承UIView
。
@smparkes'的答案很好,但有时代表团不会做你想要的,或者太不方便了。在这种情况下,它可能是后者。
请考虑将该事件作为UIScrollView
随处使用,但要破坏您不需要的功能。 UIScrollView
实例的行为与UIView
实例完全相同 - - 好吧,他们是UIView
个实例 - 所以你可能只是解决这个简单的问题,“干扰他们中的一些操作”并继续前进。关闭缩放,关闭滚动等...
不幸的是,这是单继承语言的现实。无论你做什么,都不要尝试用改变isa
之类的东西来解决这个问题。如果你有任何成功,它将不会持久。 Objective-C只是略微动态,并且不允许常规程序员认真使用这种东西。
答案 2 :(得分:0)
好吧,也许这完全是疯了,但是ISA切换是一种选择吗?
object->isa = [SomeClass class];
请参阅:Objective-C: How to change the class of an object at runtime?
如果你实现了一个知道如何将其ISA指针切换到UIScrollView子类的UIView子类,你只需要处理一个类,甚至可以动态决定你想要在运行时看到哪些视图。
请注意,这纯粹是理论上的。我从来没有在实时代码中使用ISA切换,我个人认为这不是一个好的设计:P
编辑: 但同样,它并没有减少任何裁员...... 我已经阅读了更多的主题,它似乎并不值得推荐(旧对象的内存结构保持不变,例如。)
答案 3 :(得分:-1)
是的,您可能对使用Class-cluster感兴趣。这可以产生对象,比如MyCompositeClass,它将生成MyCompositeScrollClass对象或MyCompositeViewClass对象。
Apple在NSArray中使用类集群很多,当你使用它时,在场景后面你操纵不同的对象。差异是基于数组的大小,例如对于一些小数组,NSArray将实例化一个专门用于小数据结构的类等...
这具有良好性能的优势,并且通过这种类集群概念,用户完全忽略了复杂性。
我邀请您阅读一些有关该文档的文档,这可能更容易理解。 https://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/ClassCluster.html
希望这有用:)