我知道这种问题已被多次询问,但环顾四周我找不到适合我的问题的解决方案。
我有一个名为Base
的类来自我正在使用的框架,我需要扩展其功能,同时仍然能够访问其原始方法和属性。由于框架和我的代码将同时和异步地使用相同的Base
对象,我需要两者都能够这样做。所以我想:子类化。
但它不只是关于子类化:我需要的更类似于向下转型。这是我需要从一个对象仍然是框架的Base
对象访问我自己定义的属性。所以,假设我创建了一个Derived
子类来完成这项工作:如何初始化?我不能只使用复制构造函数,因为我需要处理框架正在处理的相同对象。我不能使用类别,我需要添加ivars。
你知道怎么办?
答案 0 :(得分:2)
如果我理解正确,您不仅可以访问Base
方法和iVar,还可以访问存储在{{>特定实例中的iVar的实际值{{ 1}}类。这听起来像是你想要使用构图的完美例子。复合类是您自己的自定义类及其自定义方法和iVars,它还包含Base
类的实例。
Base
现在,当您创建@class Base;
@interface Derived : NSObject {
Base *baseObject;
// Add your iVar's here.
}
// Add your declared properties/methods here
@end
实例时,您需要分配您想要访问的Derived
实例:
Base
注1 您还可以向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>);
添加“隐藏”Derived
的方法,这样您就不必将其暴露给外界。
注释2 在大多数情况下,我还建议使用声明的属性而不是iVars,但上面的示例显示了iVars,因为这就是您所询问的内容。