Я написал категорию в SCNRenderer, которая добавляет некоторые методы использования камеры. Те же самые методы будут одинаково полезны для SCNView и SCNLayer. Все три класса, к которым относится данная категория, соответствуют SCNSceneRenderer. Можно ли написать категорию, которая применяется не к определенному классу, а ко всем классам, которые соответствуют конкретному протоколу?Внедрение категории во всех классах, соответствующих протоколу
3
A
ответ
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. Я думаю, что путь записи служебных функций - это, вероятно, путь. Я, вероятно, сделаю их методами класса для некоторого класса утилиты. –
Да ... Оглядываясь назад на категорию по идее NSObject, это очень странно, потому что вы не очень выигрываете ... –