0

我知道这种问题已经被问过很多次了,但是环顾四周,我找不到适合我问题的解决方案。比如说,我有一个从我正在使用的框架中调用的类,Base我需要扩展它的功能,同时仍然能够访问它的原始方法和属性。由于框架和我的代码都将同时和异步地处理同一个Base对象,我需要两者都能够这样做。所以我想:子类化。
但这不仅仅是关于子类化:我需要的是更类似于向下转换。这是我需要从一个仍然应该是Base框架对象的对象访问我自己定义的属性。所以假设我创建了一个Derived子类做的工作:如何初始化?我不能只使用复制构造函数,因为我需要使用框架正在处理的相同对象。而且我不能使用类别,我需要添加 ivars。你知道有什么办法可以做到吗?

4

1 回答 1

2

如果我理解正确,您不仅希望访问Base方法和 iVar,还希望访问存储在类的特定实例中的 iVar 的实际值Base。这听起来像是您何时想要使用合成的完美示例。复合类是您自己的自定义类,具有其自定义方法和 iVar,其中还包含您的Base类的实例。

@class Base;

@interface Derived : NSObject {
    Base *baseObject;
    // Add your iVar's here.
}   
// Add your declared properties/methods here
@end

现在,当您创建Derived实例时,您需要分配Base您想要访问的实例:

Derived *derivedInstance = [[Derived alloc] init];

// Now set the baseObject.  This could also be set by the Derived class itself if 
// you are creating a new instance or are accessing a "known" object 
// (ie Singleton or global object).
derivedInstance.baseObject = myBaseObjectThatIWantToAccess;

NSLog("Derived iVar: %@", derivedInstance.<ivar>);
NSLog("Base Object iVar: %@", derivedInstance.baseObject.<iVar>);

注意 1您还可以添加Derived“隐藏”的方法,baseObject这样您就不必将其暴露给外界。

注意 2在大多数情况下,我还建议使用声明的属性而不是 iVars,但上面的示例显示了 iVars,因为这是您所问的。

于 2013-02-20T15:23:49.890 回答