【问题标题】:Create categories, inherance or delegate?创建类别、继承还是委托?
【发布时间】:2011-05-27 16:40:05
【问题描述】:

我有一个小问题。我的场景是:我将构建一个有很多目标的项目。我想要“公共代码”(针对所有目标)和“特定代码”。问题是:在“公共代码”中,我需要在“特定代码”处调用函数。

我的第一次尝试是使用类别。我使用类别创建“public.h”,然后创建“public+specific.h”代码。将使用此类的类需要:

#import "public+specific.h"
...
public *myClass = [[public alloc] init];
[myclass doSomething];

要使用另一个特定的类,我只需要更改 #import 即可。独特的问题是,在“公共课”中,我需要创建一个假函数,比如。

//public.h
@interface public : NSObject {}
...
- (void) doSomething {return };

//public+specific.h
@interface public (specific)
...
 - (void) doSomething { //do what it really have to do };

其他问题是类别固有的:我无法创建局部类变量,所有变量都必须在“public.h”中声明。我想在特定的课程中拥有所有特定的东西......

好的,所以我尝试了另一种方式:将继承与委托一起使用。在“public.h”和“public+specific.h”类中它工作得很好,不需要使用假函数,一切都很好。但是,(除了一个但是),我总是必须分配特定的类,如果我不想要这个,我可以创建一个假函数来调用委托,所以我有上面同样的问题。这是一个示例:

  //In public.h
  @protocol publicDelegate
    -(void)doSomething;
  @end
  @interface public : NSObject {
      id <publicDelegate> myDelegate;
   }
   -(id)initWithDelegate (id <publicDelegate>)initDelegate{
       myDelegate = initDelegate;
       [myDelegate doSomehing];
   }

   //public+specific.h   //The '+' isn't correct here :P
   #include public.h
   @interface public_specific : public <publicDelegate> {}
   - (id)init{
        return [super initWithDelegate:self];
   }  
   - (void) doSomething { //do what it really have to do };

就像我说的,这里的问题是我如何创建这个对象

   #import "public+specific.h"
   ...
   public_specific *myClass = [[public_specific alloc] init];
   [myClass doSomething];

有了这个,每次我需要创建一个对象调用时,我都必须创建很多 #if defined ,#elif defined...。对于类别,我只需要使用 "#include" 来执行此操作。

为了解决这个问题,我可以有这样的东西:

    //in "public.h"
    - (void) doSomething { 
         return [myDelegate doSomehing]
    };

另外一次我将创建假函数。最糟糕的是,对于“public+specific.h”中的每个新函数,我将不得不创建另一个假函数.. zzz..(在类别中,我必须只对“public”中调用“public.h”的函数执行此操作+specific.h")

那么,有人对这个问题有其他想法吗?这是一个小问题,但我想让我的代码好,易于开发和清理......

【问题讨论】:

    标签: objective-c inheritance delegates categories


    【解决方案1】:

    在许多情况下,composition 会很好地为您服务。

    【讨论】:

    • 我没有看到这对我有什么帮助。这只是用一些数据或函数创建另一个类。我认为看起来像是创建特定的类。但感谢您的提示。
    • 罗德里戈,我看不出它不能解决什么问题(来自你的原始帖子)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2012-05-29
    • 2011-07-12
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多