将相同的类别添加到多个类
我有一个Objective-C类,我想添加到多个类而不重复该类别中包含的代码。 我只是想将相同的方法添加到多个类。
我有NSManagedObject
子类( Book
, Chapter
, Page
)上的现有类别,我想以一个干净和可维护的方式在这些子类中添加通用function。
一种方法是将类添加到它们的公共超类( NSManagedObject
)中,但是当我想要将方法添加到三个NSManagedObject子类( Book
, Chapter
, Page
)时,这会导致将类的方法添加到所有NSManagedObject
子类。
另一个解决scheme是子类化NSManagedObject
,然后从该NSManagedObject
子类inheritanceBook
, Chapter
和Page
inheritance。 这是最清洁,最直接的方法。 这种方法的一个很大的不利之处是,当数据模型改变,Xcode重新生成子类时,它将把它重置为从NSManagedObject
而不是SubclassedManagedObject
inheritance。 如果可能的话,我想避免使用像mogenerator / Xmo'd这样的东西。
是否有可能在多个类上添加单个类别而不重复代码?
谢谢。
也许是为时已晚……但也许有一种方法可以做到这一点..但是,你说…需要有相同的超类
Category.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
我不喜欢这个,但它的作品
为什么不在中心类中创build共享代码类级别的方法,只需在每个类别中通过shell方法调用?
如果您的类别存储关联的引用,则可以将这些引用传递给类级别的方法以进行操作。
对于其余的东西,据我所知,你将不得不回头为你的三个class级制定一个共同的子类来得到你想要的东西。 但是我可以指出的是,不用做自己的isSupported方法,而是简单地使用NSObject的respondsToSelector方法来判断你的类是否实现了你想让这三个类使用的任何特殊的方法,这应该会更好比检查所有这些类。 如果你添加额外的类,你不必保持或扩大isMemberOfClass检查的巨大列表
这听起来有点像你想要的东西像一个ruby模块。 我不知道有什么办法在客观上做这样的事情。 你可以制定一个协议,并使你的每个类符合你的协议,但是这并不能解决共享方法实现的问题。
看看这个问题 ,可能会提供更多的见解。
在nsmanagedobject上提供一个类别“有一个意想不到的结果,就是将类的方法添加到所有的NSManagedObject子类中”。 将类别代码包含在您正在使用它的文件中时,类别代码才会链接:您没有修改nsmanagedobject。
也就是说,如果代码需要知道它的对象,那么可以创build一个这些类符合的协议,然后在代码中使用conformsToProtocol来进行testing。 这可能是比testing特定类types更好的通用方法。
我仍然没有意识到在Objective-C中做到这一点,但是使用Swift 2.0,可以使用协议扩展通过向现有协议添加function和/或属性来实现。 该协议可以被任意数量的类,结构体和/或枚举所采用。
protocol Numbered { func number() -> Int } extension Numbered { func number() -> Int { return Int(arc4random()) % 10 } } class Book : Numbered { } class Chapter : Numbered { } class Page : Numbered { } let myBook = Book() let myChapter = Chapter() let myPage = Page() print("myBook.number() = \(myBook.number())") print("myChapter.number() = \(myChapter.number())") print("myPage.number() = \(myPage.number())")
在所有三个类( Book
, Chapter
, Page
)上正确地实现了number()
):
myBook.number() = 5 myChapter.number() = 2 myPage.number() = 8