2013-02-21 2 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. Я думаю, что путь записи служебных функций - это, вероятно, путь. Я, вероятно, сделаю их методами класса для некоторого класса утилиты. –

+0

Да ... Оглядываясь назад на категорию по идее NSObject, это очень странно, потому что вы не очень выигрываете ... –

0

Я не думаю, что вы можете добавить категорию по протоколу, поскольку протокол просто определяет интерфейс не для реализации. В то время как в категории мы также должны реализовывать.