我有一点脑屁。我希望有人可以帮助我。
我有一个与不同设备通信的应用。根据它与之通信的设备,我需要使用不同的方法。
我有几个不同的类进行一些解析,我已经创建了一个名为Parse
的类的子类(不要与Parse云服务混淆),这些只有Class方法。例如Parse_Device1
Parse_Device2
我有第三个类(让我们称之为Selection
),它会返回各种不同的东西,具体取决于应用与之通信的设备。
如何让这个类返回所需的Parse
子类并使用返回的内容?
我知道我可以轻松alloc
和init
所需的课程,存储或归还。
但是,由于解析类上的所有方法都只是Class方法,因此根本不需要init
。
我尝试过这样,但我似乎无法直接使用返回的类:
+ (Parser *)parser_AccessList
{
switch ([self brand]) {
case Brand1:
return [Parse_AccessList_1 alloc];
break;
case Brand2:
return [Parse_AccessList_2 alloc];
break;
case Brand3:
return [Parse_AccessList_3 alloc];
break;
default:
return nil;
break;
}
}
我可能在这里遗漏了一些非常简单的东西。
由于
答案 0 :(得分:1)
返回类对象。然后,调用者可以对该类的对象进行实例化或对其调用类方法(通过发送类方法选择器)。
return [Parse_AccessList_1 class];
我们假设这是在调用者的某个地方:
Class clazz = yourObject parser_AccessList];
[clazz performSelector:@selector(someMethod)];
由于clazz
是Class
类型的对象,因此可以调用相关的类方法someMethod
。
但是,我相信有更好的方法可以达到目标。尝试使用委托模式和/或依赖项反转。
答案 1 :(得分:1)
此方法(消息):
parser_AccessList
回归:
(Parser *)
这意味着它将始终返回分配的类类型,因此如果要返回“any”类,则应该像这样定义方法:
+ (id)parser_AccessList
这个问题是你不知道你应该期望哪个类,所以你可能会在初始化之后验证它。
另外,您确定不需要初始化这些解析器吗?
...
return [[Parse_AccessList_1 alloc] init];
...
答案 2 :(得分:0)
在类方法中,“self”是类本身。分配实例时([Parse_AccessList_1 alloc]),您必须初始化!
编辑:
#import <objc/runtime.h>
...
Class cl = NSClassFromString(@"TestClass");
return [[cl alloc] init];