Objective c 从非重写方法调用重写方法使用基类实现

Objective c 从非重写方法调用重写方法使用基类实现,objective-c,inheritance,methods,Objective C,Inheritance,Methods,我在基类中有一个方法调用,如下所示: #import <Foundation/Foundation.h> @interface BaseController : NSObject -(void)login; @end 我想在派生类中重写方法performTask,并让未更改的login方法调用被重写的方法。这应该很容易。我缺少什么?只要重写performTask,子类实例将在收到performTask消息时自动使用自己的实现。只要重写performTask,子类实例将在收到

我在基类中有一个方法调用,如下所示:

#import <Foundation/Foundation.h>

@interface BaseController : NSObject

-(void)login;

@end



我想在派生类中重写方法
performTask
,并让未更改的
login
方法调用被重写的方法。这应该很容易。我缺少什么?

只要重写
performTask
,子类实例将在收到
performTask
消息时自动使用自己的实现。

只要重写
performTask
,子类实例将在收到消息时自动使用自己的实现
performTask
消息。

如Chuck所述,只需覆盖该方法,但注意不要在新实现中调用[super-performTask]。

如Chuck所述,只需覆盖该方法,但注意不要在新实现中调用[super-performTask]。

到底是什么问题?在子类中重写
performTask
时,子类的实例将使用
callingMethod
中重写的
performTask
方法。无需重新编写;这对我来说就像预期的那样。这是给您带来麻烦的代码的复制粘贴吗?请在创建子类实例并调用该方法的地方发布代码。发现错误时,我正在使用基类的alloc方法初始化派生类。多么愚蠢的错误啊。谢谢Terry Wilcox的建议。到底是什么问题?在子类中重写
performTask
时,子类的实例将使用
callingMethod
中重写的
performTask
方法。无需重新编写;这对我来说就像预期的那样。这是给您带来麻烦的代码的复制粘贴吗?请在创建子类实例并调用该方法的地方发布代码。发现错误时,我正在使用基类的alloc方法初始化派生类。多么愚蠢的错误啊。谢谢@Terry Wilcox的建议。我重写了performTask,但仍然调用了父类方法。我认为这可能与我也需要重写callingMethod这一事实有关。这可能是因为消息是由父级发送到“self”的。您确定您正确地重写了该方法,即使用完全相同的签名吗?您确定在测试中创建了子类而不是基类吗?派生类的init方法看起来如何?重写方法具有相同的返回类型和参数数。不使用super关键字。init方法设置self=[super init]。有什么可疑的吗?@Patrick Hogan:
self
是响应消息的对象,不管它是什么。如果它对你不起作用,试着发布一个更完整的代码示例来说明问题,因为这是Objective-C中的工作方式,在所有其他程序中都是如此,所以问题一定是你没有提到的代码的一些细节。谢谢你继续关注。我在上面发布了更多的代码。顺便说一下,我也尝试过重写login方法。仍然调用基类方法。非常奇怪。我重写了performTask,但仍然调用了父类方法。我认为这可能与我也需要重写callingMethod这一事实有关。这可能是因为消息是由父级发送到“self”的。您确定您正确地重写了该方法,即使用完全相同的签名吗?您确定在测试中创建了子类而不是基类吗?派生类的init方法看起来如何?重写方法具有相同的返回类型和参数数。不使用super关键字。init方法设置self=[super init]。有什么可疑的吗?@Patrick Hogan:
self
是响应消息的对象,不管它是什么。如果它对你不起作用,试着发布一个更完整的代码示例来说明问题,因为这是Objective-C中的工作方式,在所有其他程序中都是如此,所以问题一定是你没有提到的代码的一些细节。谢谢你继续关注。我在上面发布了更多的代码。顺便说一下,我也尝试过重写login方法。仍然调用基类方法。非常奇怪。只有在不需要超级性能任务处理的情况下。如果重写应该扩展基本方法,那么首先调用超级方法是有意义的。这种情况下,Patrick wantI无法从他的问题中得出结论。只有在不需要超级性能任务处理的情况下。如果一个覆盖应该扩展基本方法,那么首先调用超级方法是有意义的。这种情况下,Patrick wantI无法从他的问题中得出结论。
#import "BaseController.h"

@implementation BaseController

-(void)performTask
{
 return @"Base method loaded";
}


-(void)login
{
 [self performTask];
}


-(id)init
{
 if ((self = [super init]))
 {

 }

 return self;
}

-(void)dealloc
{
 [super dealloc];
}

@end
#import <Foundation/Foundation.h>
#import "BaseController.h"

@interface DerivedController : BaseController

-(void)performTask;

@end
#import "DerivedController.h"

@implementation DerivedController

-(void)performTask
{
 NSLog(@"Inherited method loaded.");
}

-(id)init
{
 if ((self = [super init])) { }

 return self;
}

-(void)dealloc
{
 [super dealloc];
}

@end