如何从Objective C中现有的一个超类初始化一个新对象

时间:2013-02-20 14:59:08

标签: objective-c inheritance

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

1 个答案:

答案 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,因为这就是您所询问的内容。