将相同类别添加到多个类

时间:2012-02-26 04:30:49

标签: objective-c ios cocoa-touch cocoa objective-c-category

我有一个Objective-C类别,我想在不重复类别中包含的代码的情况下添加到多个类中。我只想将相同的方法添加到多个类中。

我在NSManagedObject子类(BookChapterPage)上有现有类别,我希望以干净,可维护的方式在这些子类中添加常用功能

一种方法是将类别添加到它们的公共超类(NSManagedObject),但是当我想将方法​​添加到三个时,这会导致将类别的方法添加到所有NSManagedObject子类中NSManagedObject子类(BookChapterPage)。

另一个解决方案是子类NSManagedObject,然后让BookChapterPage继承自NSManagedObject子类。这是最干净,最直接的方法。这种方法的一大缺点是当数据模型发生变化并且Xcode重新生成子类时,它会将它们重置为继承自NSManagedObject而不是SubclassedManagedObject。如果可能的话,我想避免使用像mogenerator / Xmo这样的东西。

是否可以在多个类上添加单个类别而无需重复代码?

感谢。

6 个答案:

答案 0 :(得分:4)

也许为时已晚......但也许有一种方法可以做到这一点...... 但是,你说...需要拥有相同的超类

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

我不喜欢这样,但它有效

答案 1 :(得分:2)

为什么不在中心类中创建共享代码类级别方法,只需在每个类别中通过shell方法调用?

如果你的类别存储了相关的引用,你可以将它们传递给类级方法来进行操作。

答案 2 :(得分:1)

我还没有意识到在Objective-C中采用干净的方法,但是使用Swift 2.0,可以通过向现有协议添加函数和/或属性,使用Protocol Extensions实现。然后,该协议可以由任意数量的类,结构和/或枚举采用。

          users GET    /users(.:format)                        users#index
                POST   /users(.:format)                        users#create
       new_user GET    /users/new(.:format)                    users#new
      edit_user GET    /users/:id/edit(.:format)               users#edit
           user GET    /users/:id(.:format)                    users#show
                PATCH  /users/:id(.:format)                    users#update
                PUT    /users/:id(.:format)                    users#update
                DELETE /users/:id(.:format)                    users#destroy

在所有三个类(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())") number()Book)上正确实施Chapter

Page

答案 3 :(得分:0)

对于你的其他东西,据我所知,你必须返回并为你的三个类创建一个共同的子类来获得你想要的东西。但是我可以指出的是,不是自己使用isSupported方法,而是简单地使用NSObject的respondsToSelector方法来判断你的类是否实现了你希望这三个类使用的任何特殊方法,这应该更好检查所有这些课程。如果您添加其他类,因为您不必维护或扩展isMemberOfClass检查的巨大列表

,这样做会更好

答案 4 :(得分:0)

听起来有点像你想要的东西像ruby模块。我不知道有任何办法在Objective-c中做这样的事情。您可以制定协议并使每个类符合您的协议,但这并不能解决共享方法实现的问题。

查看this question,它可能会提供更多见解。

答案 5 :(得分:0)

如果说在nsmanagedobject上提供类别“会产生意外后果,即将类别的方法添加到所有NSManagedObject子类中,这有点用词不当。”当您将类别代码包含在正在使用它的文件中时,它只是链接的:您不是在修改nsmanagedobject。

也就是说,如果代码需要知道它的对象,你可以创建这些类符合的协议,然后在代码中使用conformsToProtocol来进行测试。这可能是比测试特定类类型更好的通用方法。