方法是否可能(或可取)识别其调用者?

Is it possible (or advisable) for a method to recognize its caller?

我正在开发一款简单的游戏,玩家需要掷骰子,然后 "the computer" 需要掷骰子。

我想要一个 roll 方法,它对每种类型的玩家的表现略有不同。

它目前设置了一个名为 isPlayerBOOL 参数(相对于 isComputer)。玩家传递一个 TRUE 值,计算机传递一个 FALSE。方法中有一些 if 语句会相应地起作用。

这对我来说似乎很笨拙。有没有更好的方法?

我正在考虑创建一个 PlayerType 枚举,每个玩家都有一个类型,但他们仍然需要将类型传递给方法。那或者他们可以将游戏变量更改为该类型,并且该方法可以识别该类型。

任何想法都会有所帮助。谢谢。

不,这看起来不错,是一种常用且简单的模式。

A​​ BOOL 一直都很好,只有两种类型的玩家(或行为),然后如果玩家数量超过 2,则转向 enum

或者存在多态性,其中 roll 方法根据实现它的 subclass 表现不同。这将不需要传递任何参数,因为行为 锁定在 到 class.

传递枚举可能是一个不错的选择。

另一个是创建一个名为 "Protagonist" 的超类(例如)实现一个 roll() 方法和另外两个 类 "Human" 和 "Player"继承自 "Protagonist"。这样,您就可以为每种播放器指定行为。

//Protagonist.h (your superclass)
@interface Protagonist : NSObject

- (void)roll;

@end

//Player.h
#import "Protagonist.h"

@interface Player : Protagonist

@end

//Player.m
@implementation Player

- (void)roll {
    NSLog(@"I'm a real player");
    }

@end

//Computer.h
#import "Protagonist.h"

@interface Computer : Protagonist

@end

//Computer.m
@implementation Computer

- (void)roll {
    NSLog(@"I'm a computer");
}

@end

//ExternalController.m
Protagonist *computer = [Computer new];
[computer roll]; //"I'm a computer"

Protagonist *computer = [Player new];
[computer roll]; //"I'm a real player"