我有一个超类,SuperClassYeh和一个子类SubClassYeh。我在SuperClassYeh中有方法inheritTest
,我在SubClassYeh中覆盖inheritTest
。我通过在SubClassYeh中调用方法testSuperAndSelf
来启动程序。此方法将在SuperClassYeh中调用另一个方法fromYEH
。在fromYEH
中,我想在SuperClassYeh中调用inheritTest
。我怎么做?使用[self inheritTest]
调用SubClassYeh中的inheritTest
,而不是SuperClassYeh。
这是启动整个运行的代码片段
SubClassYeh *testing = [[SubClassYeh alloc] init];
[testing testSuperAndSelf];
这是SuperClassYeh
的代码片段- (void) fromYEH
{
[self inheritTest]; //Calls the inheritTest in SubClassYeh, not SuperClassYeh
}
- (void) inheritTest
{
NSLog(@"Testing Indicator. Inside SuperClassYEH inheritTest");
}
这是SubClassYeh
的代码片段- (void) inheritTest
{
NSLog(@"Testing Indicator. Inside SubClassYeh inheritTest");
}
- (void) testSuperAndSelf
{
[super fromYEH];
}
答案 0 :(得分:5)
你不能,,这是Objective-C中继承的预期行为。
如果self
是SubClassYeh
的实例,那么
[self inheritTest]
调用SubClassYeh
的{{1}}实现(如果有的话),
无论从哪里发送消息(子类或超类)。
inheritTest
和[super fromYEH]
之间的唯一区别是查找
因为“fromYEH”消息从超类开始,但它不会改变事实
[self fromYEH]
是self
的实例。
并且您无法阻止在Objective-C中覆盖方法 (请参阅How to avoid superclass methods getting overridden by sub class in objective - c或其他关于该主题的Q& A)。
在超类中唯一可以做的就是选择方法名称 那些未被覆盖的意外,例如通过为方法名称添加前缀 使用类名称,如下所示:https://stackoverflow.com/a/17209309/1187415。
答案 1 :(得分:0)
如果你可以从SubClassYeh拨打[super fromYEH]
,那么以同样的方式调用[super inheritTest]
有什么问题?
答案 2 :(得分:0)
即使这是一个非常奇怪的行为,你可以尝试这样的事情(实际上没有测试它)
- (void) fromYEH
{
bool isSubClass = [self isKindOfClass:[SubClassYeh class]];
if(isSubClass == YES)
{
[super performSelector:@selector(inheritTest)];
}
else
{
[self inheritTest];
}
}
无论如何,即使这段代码真的有用,我仍然认为这是非常糟糕的做法。
修改强>
在XCode中检查了这一点。它不会做诀窍=)所以赞成马丁的回答=)
答案 3 :(得分:0)
我找到了解决方案。不要在[super fromYeh]
中调用testSuperAndSelf
,而是将接收器更改为超类。使用[[[[SubClassYeh superclass] alloc] init] fromYEH]
。在方法fromYEH
内,inheritTest
的{{1}}将被调用
以下是SuperClassYEH
中方法testSuperAndSelf
的代码片段。其他代码保持不变。
SubClassYeh
答案 4 :(得分:0)
仅供记录......
如果从不同的角度来看,你想要做的事情并不像你想象的那么困难。
您所要做的就是定义一个C函数并调用它。
- (void) fromYEH
{
inheritTest(self); //Calls the inheritTest() in SuperClassYeh
}
void inheritTest(SuperClassYeh *self)
{
NSLog(@"Testing Indicator. Inside SuperClassYEH inheritTest");
}
- (void) inheritTest
{
inheritTest(self);
}
(我喜欢名字......;)