gpt4 book ai didi

ios - 游戏类的 Objective C 多态性

转载 作者:行者123 更新时间:2023-11-29 11:02:03 27 4
gpt4 key购买 nike

我的情况是我的应用程序中有几个不同的迷你游戏。 The games are listed in a table view, and when one of them is selected I create the corresponding game object.我需要游戏对象有一个共同的父类,这样我就可以做一些共同的事情,比如暂停和恢复。

我有一个通用的 GameScene 类,它有一个通用的 GameLayer 属性:

@interface GameScene : CCScene {

}

@property (nonatomic, strong) GameLayer* gameLayer;

然而,GameScene 的每个子类都有自己的 GameLayer 类型。例如,SuperMarioBros_GameScene 有一个 SuperMarioBros_GameLayer。当我初始化 SuperMarioBros_GameScene 时出现问题:

-(id) init
{
if( (self = [super init])) {
self.gameLayer = (SuperMarioBros_GameLayer*)[SuperMarioBros_GameLayer node];
[self addChild: self.gameLayer];

SuperMarioBros_InputLayer *inputLayer = [SuperMarioBros_InputLayer node];
inputLayer.delegate = self.gameLayer; //ERROR (see below)
[self addChild:inputLayer z:1 tag:2];
}
return self;
}

一般每个游戏都会有一个输入层,它会向gameLayer发送UI消息。我收到此错误:

Assigning to 'id <SuperMarioBros_FireDelegate> from incompatible type GameLayer*

我知道这是因为 SuperMarioBros_GameLayer 实现了 <SuperMarioBros_FireDelegate> ,但 GameLayer 没有。

所以我的问题是如何让 GameScene 类拥有一个可以是 GameLayer 的任何子类的多态属性?请记住,每种类型的 GameLayer 可能会根据其相应的输入层实现不同的协议(protocol)?或者也许有更好的方法来解决这个问题?

同样,最终目标是能够从主游戏 Controller 进行调用,例如

[currentGameScene pause];

它会依次做类似的事情:

[self.gameLayer pauseGameLoop];

最佳答案

SuperMarioBros_GameScene类的实现文件中,可以在类扩展中覆盖gameLayer属性的属性声明:

@interface SuperMarioBros_GameScene ()
@property (nonatomic, strong) SuperMarioBros_GameLayer *gameLayer;
@end

那么你应该不会再得到编译器错误了。

这不会创建新的 getter 或 setter 函数(这些仍然在父类(super class)中调用),并且不会引入新的实例变量作为后备存储。它只是告诉编译器,self.gameLayer 是这个实现文件中子类的一个实例。

关于ios - 游戏类的 Objective C 多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15438501/

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