在Objective-C中,可以使用派生类“实例化”协议吗?

时间:2012-11-22 23:16:54

标签: objective-c cocoa

我在Objective-C中编写了一个名为BHIDataFormatter的协议,该协议由BHCsvDataFormatterBHJsonFormatterBHXmlFormatter类实现。

作为.NET开发人员,可以通过以下方式获取所需的实例:

IDataFormatter formatter;
if (csv) formatter = new CsvDataFormatter();
else if (json) formatter = new JsonFormatter();
else if (xml) formatter = new XmlDataFormatter();
else throw SomeException("Cripes");

基本上,我如何在Objecive-C中做同样的事情?我试过了,虽然BHIDataFormatter是一个“未知类型”:

BHIDataFormatter* formatter;
if (csv) formatter = [[BHCsvDataFormatter alloc] init];
else if (json) formatter = [[BHJsonDataFormatter alloc] init];
else if (xml) formatter = [[BHXmlDataFormatter alloc] init];
else [[NSException exceptionWithName:@"SomeException" reason:@"Cripes" userInfo:nil] raise];

以下似乎有效,虽然看起来过于通用(我宁愿明确地使用BHIDataFormatter):

Protocol* formatter = [[CsvDataFormatter alloc] init];

2 个答案:

答案 0 :(得分:2)

您需要将变量声明为符合协议的类型id

id<BHIDataFormatter> formatter;

id是指向任何对象的指针 您还声称该对象符合BHIDataFormatter

答案 1 :(得分:0)

正如保罗所说,你需要使用

id<MyProtocolName> myNewVariable;

这是一个很好的介绍:

http://mauvilasoftware.com/iphone_software_development/2008/05/a-brief-intro-to-objective-c-p.html