我需要将同一个方法从4个不同的类移到超类。 除了在它们中声明的变量的类型之外,这些方法完全相同:
例如,在第一堂课的方法中我有
FirstClass var = [[FirstClass alloc] init]
在第二课
SecondClass var = [[SecondClass alloc] init]
等等。
在超类中实现此变体的最佳方法是什么?
我应该在超类中使用NSClassFromString并从子类中的每个方法获取每个字符串吗?
感谢
答案 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转换为适当的类型。