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