【问题标题】:Is it possible (or advisable) for a method to recognize its caller?方法是否可以(或可取)识别其调用者?
【发布时间】:2015-04-22 14:54:50
【问题描述】:

我正在开发一个简单的游戏,玩家需要掷骰子,然后“计算机”需要这样做。

我想要一个roll 方法,它对每种类型的播放器执行略有不同。

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

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

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

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

【问题讨论】:

    标签: ios objective-c function enums


    【解决方案1】:

    不,这似乎很好,是一种常用且简单的模式。

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

    另外还有多态性,其中roll 方法的行为因实现它的子类而异。这将不需要传递任何参数,因为行为被锁定到类中。

    【讨论】:

    • 你能简要说明一下roll方法是如何识别哪个子类调用它的吗?
    • @MayNotBe 我的意思是每个子类都会以不同的方式实现 roll 方法。当不使用多态方法时,有必要将方向传递给方法,就像您当前所做的那样。
    • 是的,这很有道理!谢谢!
    【解决方案2】:

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

    另一个是创建一个名为“Protagonist”的超类(例如)实现roll() 方法和从“Protagonist”继承的另外两个类“Human”和“Player”。这样,您可以指定每种玩家的行为。

    //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"
    

    【讨论】:

    • 问题标记为 Objective-C。最好以相关语言提供答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2014-10-20
    • 1970-01-01
    相关资源
    最近更新 更多