将所有消息转发给其他对象

Lex*_*ndr 0 cocoa objective-c objective-c-runtime

我有下一个问题:
我有一个NSButtonCell类的装饰器,它增加了一些功能.因为它是一个装饰器 - 是它的子类NSButtonCell.我不喜欢创建子类,因为必须将相同的功能动态添加\删除到其他一些子类NSButtonCell.并且,因为它是一个装饰器,我必须将所有消息转发到装饰对象,因为一些子类可以有自己的'设置',行为等.因为NSButtonCell有很多方法,我不能编写代码将所有消息重定向到装饰对象.请告诉我,如何将所有收到的消息重定向到装饰对象?

bbu*_*bum 5

圆钉符合方孔.

您之所以难以做到这一点,是因为它是一种非常非标准的模式,可用于实现UI.方法转发由任一实现forwardInvocation:NSProxy有用,但几乎从未用于在UI的上下文中实现Decorator模式.

虽然您可以使用NSProxy的子类来选择性地转发或实现您需要的方法,但与简单地创建子类相比,完全浪费了代码.

只需使用一个子类并完成它.

但是,如果你真的需要,只有子类.如果提供的NSButtonCell可以完成您需要的所有操作,而只需配置它,则可以在控制器中配置它,也可以在用于布局和显示用户界面的任何机制中配置它.

在您的情况下,它听起来像一个中央控制器或UI配置器,因为它将功能集中到一个点,然后可以控制各种UI类的多个(可能是最小的子类)实例.