objective-c - 类组合在 iOS 中是如何工作的?

标签 objective-c ios composition

假设我在 classA 上有属性 A,在 classB 上有属性 B,我想要 classAB 同时具有属性 AB。我仍然不明白如何使用组合 来实现这一切。

我知道这可以通过继承来完成,但我想学习如何使用组合 来完成。我看过示例,但仍然不明白它是如何工作的。

最佳答案

你创建了一个新类,它有 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/

相关文章:

php - 在这种情况下使用特征而不是继承或组合来重用代码有多糟糕?

function - 不能 `compose` 和方法和函数

iphone - 是否可以更改 PKAddPassesViewController 的标题?

ios - 对特定事件发表看法

ios - 从 NSUserdefaults 中删除 NSDictionary

objective-c - NSThread 内存泄漏

objective-c - 触摸时按钮不突出显示

ios - 如何导航回上一个 View

ios - TabBar 更改选定的背景颜色

objective-c - Objective-C中的类构成问题: Is it possible to inherit a class variable?