2013-02-25 89 views
0

我很难找到在Objective-C中实现类似于抽象类的方法。我想实际上并不关心如何限制使用我的基类而不创建子类,我想要的是这样的: 我想拥有类似于- (void)makeRequest的方法的类A(父/基/抽象),并且我想要在B,C,D等类中进行子类化,并具有从类'A方法中调用的方法,如- (id)getCachedResult。所以基本上我希望类A实现一些基本逻辑,我希望它的子类修改这个基本逻辑的一些细节和部分。从父进程调用子代方法

听起来像一个琐事,但我不能把我的手指在Objective-C中实现这种模式的方式。

UPDATE:

这里就是我想要做的事:

@interface A : NSObject 

- (void)makeRequest; 
- (NSString *)resultKey; 

@property (strong) NSMutableDictionary * result; 

@end 

@implementation A 

- (void)makeRequest 
{ 
    self.result[self.resultKey] = @"Result"; 
} 

- (NSString *)resultKey 
{ 
    @throw [NSException exceptionWithName:NSInternalInconsistencyException 
            reason:[NSString stringWithFormat:@"%@ should be overrided in subclass", NSStringFromSelector(_cmd)] 
           userInfo:nil]; 
    return nil; 
} 

@end 

///////////////////////////// 

@interface B : A 

@end 

@implementation B 

- (NSString *)resultKey 
{ 
    return @"key"; 
} 

@end 

当我创建B类的实例,并试图调用它的方法- (void)makeRequest我得到的例外,那就是很明显。我想要的是一种正确设计我的课程以达到同样目的的方法。

+0

这是相当平凡的。这是子类化的基本概念。你的问题究竟在哪里?您应该提供一些具体的代码示例并用它来描述问题。当你做好每一件事 - 而且犯错的机会不多 - 那么它就会按照你描述它的方式工作。 – 2013-02-25 12:28:57

+0

@HermannKlecker,好吧,我会更新我的问题,以更具体地说明我在哪里遇到问题。 – DemoniacDeath 2013-02-25 12:43:11

+1

你应该在B的接口中声明'resultKey'。 – Matthias 2013-02-25 13:41:13

回答

0

根据要求:您应该在B的界面声明resultKey。 :-)

+0

作为一个风格的问题,也许。但接口中的方法声明不会影响运行时行为。无论如何解决这个问题,事实并非如此。 – 2013-02-25 14:16:33

+0

@ChrisDevereux:我不同意。在运行时,消息被发送到所请求的**选择器**(不是方法)的“最低”(在类层次结构中)对象。编译器从接口生成选择器。它也可以在runetime完成,但这必须明确地完成。在OP的问题中,类B的选择器是未知的,因此调用超类的方法。 – Matthias 2013-02-25 15:34:12

+0

https://developer.apple.com/library/mac/ipad/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtHowMessagingWorks.html – 2013-02-25 16:05:29