第一个路径是创建一个复合对象,它声明自己是NSMutableSet的子类,但实际上只是将调用转发到内部NSMutableSet.我不想在NSMutableSet上实现每个方法,所以我认为forwardInvocation:将是完成我的任务的好方法.不幸的是,NSMutableSet的抽象类实现了接口上的所有方法,并且它们的实现抛出异常,所以我从来没有达到可以转发调用的程度.
第二条路径是nsproxy的子类,并从那里转发调用.这个解决方案不足以说我需要复制NSMutableSet的接口,除非有办法声明“这个类实现这个接口”,我不知道(这很可能是解决方案).
第三条路径是在NSMutableSet上创建一个类别,并仅为需要使用它的类导入它,但由于您无法通过类别添加非动态属性,因此该类别不足.这导致我在一个类别中使用关联对象.我愿意承认这是这个用例的正确解决方案,但我希望它不是因为它有点笨重.它是双重笨重的,因为我添加的属性是原始的,所以我必须在设置和获取关联时包装和解包它们(除非有一种方法来关联我不熟悉的基元).
本质上,我想要的是在功能上作为NSMutableSet(和所有类集群)的子类行为,但无法找出最佳方法.谢谢!
解决方法 为了完整起见,让我们看看你的第一条道路:create sort of a composite object that declared itself as a subclass of
NSMutableSet
but really just forwarded the invocations to an internalNSMutableSet
你可以子类化NSMutableSet吗?是的,但是你呢? NSMutableSet的文档说:
Subclassing Notes
There should be little need of subclassing. If you need to customize behavior,it is often better to consIDer composition instead of subclassing.
所以权衡一下,如果你想要继承,请再次参考文档:
Methods to OverrIDe
In a subclass,you must overrIDe both of its primitive methods:
addobject:
removeObject:
You must also overrIDe the primitive methods of the
NSSet
class.
看一下NSSet类文档,我们发现它的原始方法是:
Methods to OverrIDe
In a subclass,you must overrIDe all of its primitive methods:
count
member:
objectEnumerator
就是这样,5种方法.
您可以将自己的类定义为NSMutableSet的子类,添加一个实例变量,它是NSMutableSet的一个实例,实现5个方法并将它们重定向到set实例,添加您希望的任何init方法,然后添加其他属性.
如果性能受到关注,则需要权衡重定向这五种方法和访问相关对象以获取其他属性.您需要进行配置才能解决这个问题,但是当且仅当性能成为问题时.
总结以上是内存溢出为你收集整理的Objective-C – 可可类簇的有效子类化全部内容,希望文章能够帮你解决Objective-C – 可可类簇的有效子类化所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)