2013-02-21 66 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

我不認爲你可以在協議上添加類別,因爲協議只是定義接口而不是實現。而在類別中,我們也需要實施。

相關問題