0

我正在使用类别向我的班级添加功能。但是,我想在主类中共享一个通用方法,如果调用该方法,它将调用特定的类别方法。

我解释得更好,假设我有两个类别。

@interface MyClass(CategoryA) 

-(void)specificCategoryA;

@end


@interface MyClass(CategoryB) 

-(void)specificCategoryB;

@end

然后,在我的主要课程中,我想拥有:

@implementation MyClass

    -(void)utilityMethod {

      // choose one of the two...
      // -(void)specificCategoryB;
      // -(void)specificCategoryA;

    }

@end

我知道上面做不到,从某种意义上说,类别不能自省,所以我正在寻找另一种方法。对于我正在开发的应用程序,可以在编译时解决这个问题,但我愿意接受任何建议。我也试图覆盖一个通用方法名称,但我显然得到了警告

类别正在实现一个方法,该方法也将由其主类实现

这并不意味着事情不会起作用,但我不想使用类别作为继承。

4

3 回答 3

0

如果是编译时决定,您可以使用预处理器

#if some-constant-condition
  [mc specificCategoryA];
#else
  [mc specificCategoryB];
#endif
于 2012-09-10T10:50:32.227 回答
0
if ([object respondsToSelector:@selector(specificCategoryA)]) {
   [object specificCategoryA];
}
else if ([object respondsToSelector:@selector(specificCategoryB)]) {
   [object specificCategoryB];
}

但是,在我看来,您的设计存在问题 - 预处理器不是更好吗?

于 2012-09-10T11:30:03.520 回答
0

不太确定你的问题是为什么你不能使用 if 语句两个选择调用哪个方法。

此外,您正在尝试做的事情看起来您可以使用实现通用实用程序方法代码的抽象基类,然后有两个覆盖实用程序方法的子类,例如

-(void)utilityMethod
{
    [super utilityMethod];
    // subclass specific code.
}

然后让您的子类在另一个子类的一个子类 specificCategoryB 逻辑中实现 specificCategoryA 逻辑。

您可以通过将 MyClass 实现为 Cluster 类来隐藏子类的使用。您的 MyClass 的 init 方法释放创建的对象,然后根据您的条件创建一个子类,或者您可以创建一个 Class 方法,为您创建一个初始化 MyClass 的子类。用户不需要知道它是哪个子类,它只是某种 MyClass。

于 2012-09-10T11:25:31.003 回答