gpt4 book ai didi

objective-c - Objective-C 中的抽象类

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:03 24 4
gpt4 key购买 nike

我需要你的帮助。 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 中没有抽象类......

目前我正在使用协议(protocol),但我没有信心。因为不确定 doWork 是否已实现,编译器会提示

'Robot' may not respond to 'doWork'

谢谢你的想法。

最佳答案

协议(protocol)应该有效。

@protocol RobotProtocol <NSObject>
@required
- (void)doWork:(BOOL)flag;
@end

@interface Robot1 : NSObject <RobotProtocol>
@end

@implementation Robot1
- (void)doWork:(BOOL)flag
{
}
@end

Robot1 的单元测试虽然叫id<RobotProtocol>

- (void)testRobot
{
id<RobotProtocol> robot = [[Robot1 alloc] init];
[robot doWork:YES];
}

更新

查看您的代码后,@interface Robot : NSObject应该是 @interface Robot : NSObject <RobotProtocol> .问题是你不需要 @interface Robot : NSObject <RobotProtocol>根本。你可以只使用 id<RobotProtocol> .这是您的抽象类的名称。

关于objective-c - Objective-C 中的抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13768662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com