Mic*_*ner 3 abstract-class protocols objective-c cocoa-design-patterns
我需要你的帮助.以下问题在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
}
Run Code Online (Sandbox Code Playgroud)
应该怎样Robot和它的子类来实现,这Robot *rob可能是机器人的一个子类rob1,rob2,...和方法doWork:(BOOL)val;可以被称为?我的第一个想法是实现Robot一个抽象类,但不幸的是Objective-C中没有抽象类...
目前我正在使用协议,但我并不自信.因为它不确定,doWork是实现的,编译器抱怨
'机器人'可能无法回应'doWork'
谢谢你的想法.
协议应该有效.
@protocol RobotProtocol <NSObject>
@required
- (void)doWork:(BOOL)flag;
@end
@interface Robot1 : NSObject <RobotProtocol>
@end
@implementation Robot1
- (void)doWork:(BOOL)flag
{
}
@end
Run Code Online (Sandbox Code Playgroud)
Robot1尽管叫单元测试id<RobotProtocol>
- (void)testRobot
{
id<RobotProtocol> robot = [[Robot1 alloc] init];
[robot doWork:YES];
}
Run Code Online (Sandbox Code Playgroud)
更新
看完你的代码后,@interface Robot : NSObject应该是@interface Robot : NSObject <RobotProtocol>.事情是你根本不需要@interface Robot : NSObject <RobotProtocol>.你可以使用id<RobotProtocol>.这是抽象类的名称.
| 归档时间: |
|
| 查看次数: |
11375 次 |
| 最近记录: |