2013-02-21 71 views
3

我在SCNRenderer上编写了一个类别,它添加了一些相机实用程序方法。这些相同的方法对SCNView和SCNLayer同样有用。与这个类别相关的所有三个类都符合SCNSceneRenderer。是否可以编写一个不适用于特定类的类别,而是适用于符合特定协议的所有类?在符合协议的所有类上实现一个类别

回答

3

这样做是编写采取SCNSceneRenderer对象的一些实用功能的最简单的方法:如果你想使用方法调用的语法,还是希望能够覆盖的实施

void ABCDoSomethingUseful(id<SCNSceneRenderer> renderer) 
{ 
    //... 
} 

void ABCDoSomethingElseUseful(id<SCNSceneRenderer> renderer) 
{ 
    //... 
} 

子类,另一种选择是实现方法作为NSObject的类别:

// This goes in a source file: 

@interface NSObject (SCNSceneRendererConformance) <SCNSceneRenderer> 
// Surpress compiler warnings about NSObject not responding to 
// SCNSceneRenderer's messages 
@end 

@implementation NSObject (MyCategory) 

- (void)abc_doSomethingUseful 
{ 
    //... 
} 


- (void)abc_doSomethingElseUseful 
{ 
    //... 
} 

@end 

然后将其暴露在一个协议:

// This goes in a header file: 

@protocol MyProtocol <NSObject> 
- (void)abc_doSomethingElseUseful; 
- (void)abc_doSomethingUseful; 
@end 

,并添加一个唯一接口类为每个符合SCNSceneRenderer宣称这也符合你的协议类:

// This also goes in a header file: 

@interface SCNLayer (MyProtocolConformance) <MyProtocol> 
@end 

@interface SCNView (MyProtocolConformance) <MyProtocol> 
@end 
+0

我为做什么,现在只是忽视的事实是这一类将是有益的对于多于一个类而言,只需将它用于SCNRenderer。我认为编写实用函数的路线可能是一条路。我可能会让他们在某些实用程序类上使用类方法。 – 2013-02-25 20:47:02

+0

是啊...回想一下NSObject的想法,没有太多的收获是很奇怪的... – 2013-02-25 21:00:15

0

我不认为你可以在协议上添加类别,因为协议只是定义接口而不是实现。而在类别中,我们也需要实施。

相关问题