在类别中重写方法的调用优先级在子类中再次调用

时间:2015-07-30 07:50:43

标签: objective-c inheritance objective-c-category

我正在Objective-C的一个项目上工作,我正面临一种情况。

我们说我有一个名为Foo的班级。我为这个名为Foo+Bar的类实现了一个类别,并覆盖了Foo的方法fooMethod:

然后我为Foo创建了一个子类,名为Baz,并在此类中覆盖相同的fooMethod:

  1. 当我在fooMethod:对象上使用方法Baz时 实施将被称为? Foo+Bar内的那个或者Baz内的那个 一个在describe('Pmts app 5.0',function(){ var LoginPage = require("./LoginPO"); it('login test', function(){ LoginPage.setUserName('xyz@test.com'); LoginPage.setPassWord('test'); LoginPage.clickButton(); expect(browser.getCurrentUrl()).toEqual('https://localhost:1234/#/timesheet'); }); }); 内?
  2. Objective-C如何处理这种情况以及原因?
  3. 我愿意接受任何好的解释和/或文件。

2 个答案:

答案 0 :(得分:6)

如果您覆盖类别中的方法,则行为明确undefined。所以请不要:

  

如果在类别中声明的方法的名称与原始类中的方法相同,或者在同一个类(或甚至是超类)中的另一个类别中的方法相同,则行为未定义为哪个方法实现在运行时使用。

如果你在一个超类的类别中覆盖了一次定义的方法,那么当然会调用子类实现。

但是在这里你覆盖在超类中定义两次的方法。行为可能未定义,因为您覆盖未定义的实现。即使这有效,但无论如何都会是糟糕的代码。

真的,请不要这样做。

答案 1 :(得分:1)

对你的例子进行了简单的测试,结果显示类别的实现是在Buz类的实例上调用的,即使我没有在任何地方包含标题Foo + Bar,我使用的是带有iOS 8.1的iPhone 6模拟器。 Apple表示这种行为是不可预测的,因此进行此类编码是不好的做法。

  

如果在类别中声明的方法的名称与原始类中的方法相同,或者在同一个类(或甚至是超类)中的另一个类别中的方法相同,则行为未定义为哪个方法实现在运行时使用。

参见,https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html部分避免类别方法名称冲突