我正在Objective-C的一个项目上工作,我正面临一种情况。
我们说我有一个名为Foo
的班级。我为这个名为Foo+Bar
的类实现了一个类别,并覆盖了Foo
的方法fooMethod:
。
然后我为Foo
创建了一个子类,名为Baz
,并在此类中覆盖相同的fooMethod:
。
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');
});
});
内?我愿意接受任何好的解释和/或文件。
答案 0 :(得分:6)
如果您覆盖类别中的方法,则行为明确undefined。所以请不要:
如果在类别中声明的方法的名称与原始类中的方法相同,或者在同一个类(或甚至是超类)中的另一个类别中的方法相同,则行为未定义为哪个方法实现在运行时使用。
如果你在一个超类的类别中覆盖了一次定义的方法,那么当然会调用子类实现。
但是在这里你覆盖在超类中定义两次的方法。行为可能未定义,因为您覆盖未定义的实现。即使这有效,但无论如何都会是糟糕的代码。
真的,请不要这样做。
答案 1 :(得分:1)
对你的例子进行了简单的测试,结果显示类别的实现是在Buz类的实例上调用的,即使我没有在任何地方包含标题Foo + Bar,我使用的是带有iOS 8.1的iPhone 6模拟器。 Apple表示这种行为是不可预测的,因此进行此类编码是不好的做法。
如果在类别中声明的方法的名称与原始类中的方法相同,或者在同一个类(或甚至是超类)中的另一个类别中的方法相同,则行为未定义为哪个方法实现在运行时使用。