【发布时间】:2012-12-07 18:11:25
【问题描述】:
我需要你的帮助。 Objective-C 中的以下问题:
// Robot.h
@protocol RobotProtocol <NSObject>
-(void)doWork;
@end
@interface Robot : NSObject
// Rob1 sublass of class Robot
// rob1.h
@interface Rob1 : Robot <RobotProtocol>
// rob1.m
@implementation
-(void)doWork
{
// print 'robot 1'
}
// Rob2 sublass of class Robot
// rob2.h
@interface Rob2 : Robot <RobotProtocol>
// rob2.m
@implementation
-(void)doWork
{
// print 'robot 2'
}
// Task.h
@interface Task : NSObject
{
Robot *rob;
}
// Task.m
@implementation
- (id)init
{
if ([super init]) {
rob = [[Rob1 alloc] init]; // or Rob2 !!
}
return self;
}
-(void)doSomething
{
[rob doWork]; // how to make sure, that this is implemented, depending on Rob1 or Rob2
}
Robot及其子类应该如何实现,Robot *rob可以是Robotrob1、rob2、...的子类之一,并且可以调用方法doWork:(BOOL)val;?我的第一个想法是把Robot实现为一个抽象类,可惜Objective-C中没有抽象类……
目前我正在使用协议,但我没有信心。因为不确定doWork是否实现,编译器报错
“机器人”可能不会响应“doWork”
感谢您的想法。
【问题讨论】:
-
你能发布你完整的Objective C代码吗?既定义又使用?
-
您是否尝试过使用错误断言实现方法,以便它们在运行时触发?不如编译时检查好,但至少可以强制你重写。
-
在init方法中抛出异常。
标签: objective-c protocols abstract-class cocoa-design-patterns