关于将少数方法移动到超类

时间:2012-01-14 13:31:55

标签: objective-c cocoa

我需要将同一个方法从4个不同的类移到超类。 除了在它们中声明的变量的类型之外,这些方法完全相同:

例如,在第一堂课的方法中我有

FirstClass var = [[FirstClass alloc] init]

在第二课

SecondClass var = [[SecondClass alloc] init]

等等。

在超类中实现此变体的最佳方法是什么?

我应该在超类中使用NSClassFromString并从子类中的每个方法获取每个字符串吗?

感谢

2 个答案:

答案 0 :(得分:1)

我不是百分百肯定我明白你的意思。所以我可以回答错误的问题

如果在你的课程中你需要使用一个对象(我在下面称它为worker)来完成你的工作,但是这个对象的类不知道,你可以使用依赖注入(DI)。

MyClass.h

@interface MyClass : NSObject

@property (nonatomic, retain) id<WorkerInterface> worker;

@end

MyClass.m

@implementation MyClass

@synthesize worker = _worker;

- (void)myMethod;
{
    [self.worker doSomething];
}

// You could also provide a default class to use if one is not passed in
//
// - (id<WorkerInterface)worker;
// {
//     if (!_worker) {
//         _worker = [[DefaultWorker alloc] init];
//     }
//     return _worker;
// }

@end

现在每当我实例化这个类时,我都可以简单地传入适当的对象,例如:

MyWorkerClass *worker = [[MyWorkerClass alloc] init]; // <- Conforms to @protocol(WorkerInterface)
MyClass *instance = [[MyClass alloc] init];
instance.worker = worker;

[instance doSomething];

答案 1 :(得分:0)

如果您打算在子类中初始化的所有不同类型的iVar都来自公共类,那么我将该类存储在super中,或者只是将其存储为id。然后,在每个子类中设置属性访问器,根​​据需要强制转换iVar。

@interface superClass : NSObject{
    id _superIvar;
}
@end

@implementation superClass : NSObject
    ....super's code....
@end

现在在子类的实现中声明一个类别中的属性,如下所示(或在界面中,如果你想公开它)

@interface subClass (private)
@property (strong) ClassType *superIvar;
@end;

@implementation  
- (void) setSuperIvar:(ClassType *)superIvar{
    _superIvar = superIvar;
}
- (ClassType *) superIvar{
    return (ClassType *) _superIvar;
}

- (void) someMethodThatUsesSuperIvar{
    [self.superIvar doSomething];
}
@end

或者,如果您不想打开_superIvar以进行直接访问,则可以在超类上设置属性并通过子类上的属性进行访问。但通过这种方式,您可以轻松访问超级的ivars转换为适当的类型。