假设我在 classA
上有属性 A
,在 classB
上有属性 B
,我想要 classAB
同时具有属性 A
和 B
。我仍然不明白如何使用组合 来实现这一切。
我知道这可以通过继承来完成,但我想学习如何使用组合 来完成。我看过示例,但仍然不明白它是如何工作的。
最佳答案
你创建了一个新类,它有 classA 和 classB 的实例作为成员变量。然后通过 get/set 方法实现属性。
@interface ClassAB
{
ClassA *objectA;
ClassB *objectB;
}
@property (nonatomic,strong) id propertyA;
@property (nonatomic,strong) id propertyB;
@end
@implementation ClassAB
- (id)propertyA { return objectA.propertyA; }
- (void)setPropertyA:(id)value { objectA.propertyA = value; }
- (id)propertyB { return objectB.propertyB; }
- (void)setPropertyB:(id)value { objectB.propertyB = value; }
@end
这就是合成。有些语言有特殊的语法来执行此操作(例如,在 Ruby 中,您可以在另一个类/模块中包含一组方法),但 Objective-C 不允许这样做。
您可以在 Objective-C 中做的一件事是捕获发送到您的对象但没有关联方法的消息,并将它们转发给另一个对象。如果您正在编写一个将伪装成另一个类的类,或者如果有许多不同的消息要转发并且您不想手动将它们全部写出,则此技巧很有用。
使用消息转发的缺点是您会放弃一些控制权,并且很难预测消息何时会被您的类或转发类处理。例如,如果父类(super class)实现了一个方法,则该方法将被执行,转发代码将不会被调用。
关于objective-c - 类组合在 iOS 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9710411/