Agregando la misma categoría a varias classs

Tengo una categoría Objective-C que me gustaría agregar a varias classs sin duplicar el código contenido en la categoría. Simplemente quiero agregar los mismos methods a varias classs.

Tengo categorías existentes en NSManagedObject subclasss NSManagedObject ( Book , Chapter , Page ) y me gustaría agregar una funcionalidad común a través de estas subclasss de manera limpia y mantenible.

Una forma sería agregar la categoría a su superclass común ( NSManagedObject ), pero eso tiene como consecuencia agregar los methods de la categoría a todas NSManagedObject subclasss NSManagedObject cuando quiero agregar los methods a tres subclasss NSManagedObject ( Book , Chapter , Page ).

Otra solución sería subclass NSManagedObject y luego henetworkingar Book , Chapter y Page de esa subclass NSManagedObject . Este es el enfoque más limpio y directo. La gran desventaja con este enfoque es cuando el model de datos cambia y Xcode regenera las subclasss, las restablecerá a henetworkingar de NSManagedObject lugar de SubclassedManagedObject . Me gustaría evitar usar algo como mogenerator / Xmo'd si es posible.

¿Es posible agregar una sola categoría en múltiples classs sin duplicar el código?

Gracias.

tal vez sea demasiado tarde … Pero tal vez hay una forma de hacerlo … Pero, usted dijo … debe tener la misma superclass

Categoría.h

 @protocol MyProtocol <NSObject> - (NSString*)foo; @end @interface NSArray (category) <MyProtocol> @end @interface NSString (category) <MyProtocol> @end 

Category.m

 @interface NSObject (category) <MyProtocol> @end @implementation NSObject (category) - (NSString*)foo { return @"bar"; } @end 

No me gusta esto tampoco, pero funciona

¿Por qué no hacer los methods de nivel de class de código compartido en una class central, que simplemente llama mediante methods de shell en cada una de sus categorías?

Si sus categorías almacenan references asociadas, puede pasarlas a los methods de nivel de class para actuar.

Para el rest de sus cosas allí, hasta donde sé que tendría que volver y hacer una subclass común para sus tres classs para get lo que desea. Pero lo que puedo señalar es que, en lugar de hacer el suyo propio, es probable que sea mejor utilizar simplemente el método respondeSoSelector de NSObject para saber si su class implementa el método especial que desea que utilicen esas tres classs, lo que debería ser mejor que verificar en todas esas classs. Definitivamente mejor si agrega classs adicionales ya que no tiene que mantener o expandir esa list gigante de cheques isMemberOfClass

Suena como si quisieras algo así como un module de Rubyes. No sé de ninguna manera de hacer tal cosa en el objective c. Puede hacer un protocolo y hacer que cada una de sus classs se ajuste a su protocolo, pero eso no resuelve el problema de compartir la implementación de los methods.

Echa un vistazo a esta pregunta , podría proporcionar algunas más ideas.

Es un poco inapropiado decir que proporcionar una categoría en nsmanagedobject "tiene la consecuencia involuntaria de agregar los methods de la categoría a todas las subclasss NSManagedObject". El código de categoría solo está vinculado cuando lo incluye en un file en el que lo está utilizando: no está modificando nsmanagedobject.

Dicho esto, si el código necesita conocer su object, podría crear un protocolo al que se ajusten esas classs, y luego usar conformesToProtocol en su código para realizar las testings. Probablemente sea un mejor enfoque genérico que la testing para types de class específicos.

Todavía no me doy count de una forma limpia de hacer esto en Objective-C, pero con Swift 2.0 esto se puede implementar utilizando Extensiones de protocolo agregando funciones y / o properties a un protocolo existente. El protocolo puede ser adoptado por un número arbitrario de classs, estructuras y / o enumeraciones.

 protocol Numbenetworking { func number() -> Int } extension Numbenetworking { func number() -> Int { return Int(arc4random()) % 10 } } class Book : Numbenetworking { } class Chapter : Numbenetworking { } class Page : Numbenetworking { } let myBook = Book() let myChapter = Chapter() let myPage = Page() print("myBook.number() = \(myBook.number())") print("myChapter.number() = \(myChapter.number())") print("myPage.number() = \(myPage.number())") 

implementa correctamente el number() en las tres classs ( Book , Chapter , Page ):

 myBook.number() = 5 myChapter.number() = 2 myPage.number() = 8