代码之家  ›  专栏  ›  技术社区  ›  Redwood

我可以使用一个类别来重写一个方法,它本身在超类的类别中吗?

  •  1
  • Redwood  · 技术社区  · 15 年前
    @interface MySuperclass : NSObject {
    
    }
    
    @end
    
    @interface MySuperclass (MyCategory)
    
    - (void)myMethod;
    
    @end
    
    @interface MySubclass : MySuperclass {
    
    }
    
    @end
    
    @interface MySubclass (MyOtherCategory)
    
    - (void)myMethod;
    
    @end
    

    是否定义了将调用-mymethod的哪个实现?

    Kochan在Objective-C程序设计中指出:

    如果有多个类别为同一类声明了具有相同名称的方法,则未定义调用时将执行哪个方法。

    但我不确定在这个上下文中,超类上的一个类别是否被认为是同一类上的一个类别。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Felixyz    15 年前

    虽然我找不到引用,但我认为很明显 MySubclass (MyOtherCategory) 优先考虑。类别的方法被添加到这个特定的类中,因此“myotherCategory”实现将属于您的子类,并且在消息调度期间继续超类之前,它将被查找。

    正如Objective-C手册所指出的,Cocoa中的许多方法都被分类。如果查找的顺序没有被很好地定义,您就不能在子类的类别中覆盖这些方法中的任何一个,这将使类别几乎没有用处。

        2
  •  1
  •   Joshua Weinberg    15 年前

    我的直觉告诉我你会没事的,但唯一知道的方法就是尝试。我相信不确定性只在同一类中,而不是超/子类关系。