Objective-C – 可可类簇的有效子类化

Objective-C – 可可类簇的有效子类化,第1张

概述我有一个对象,曾经是一个NSMutableSet,但需要更多的东西附加到它.显而易见(显然不受支持)的事情是将NSMutableSet子类化并添加两个额外的属性.由于NSMutableSet与基本上所有的 Cocoa数据结构一样,是一个类集群,我不能以通常的方式对它进行子类化,因为超类只抛出异常.这导致我走了几条路. 第一个路径是创建一个复合对象,它声明自己是NSMutableSet的子类,但实际 我有一个对象,曾经是一个NSMutableSet,但需要更多的东西附加到它.显而易见(显然不受支持)的事情是将NSMutableSet子类化并添加两个额外的属性.由于NSMutableSet与基本上所有的 Cocoa数据结构一样,是一个类集群,我不能以通常的方式对它进行子类化,因为超类只抛出异常.这导致我走了几条路.

第一个路径是创建一个复合对象,它声明自己是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 internal NSMutableSet

你可以子类化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 – 可可类簇的有效子类化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1070583.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存