有很多不同对象的方法

时间:2015-06-26 20:31:27

标签: objective-c oop conceptual

我目前正致力于实施某种形式的游戏Arkham Horror,而且我开始挣扎于游戏中的大量独特物品和事件。例如,游戏中有许多位置事件,每个事件都有或多或少的独特实现。所以我的反应是用OOP解决这个问题,为所有事件定义一个类,并根据需要定义子类/接口。我最终定义了对象的类,这些对象只有一个实例,导致超过一百个几乎为空的类,除了重写的方法。

我覆盖的方法也越来越普遍:revealLocationEvent:有20多个不同的实现,因为一些奖励玩家,一些杀死玩家,一些导致整个游戏改变状态依赖于许多变量,一些触发用户交互所需的事件(在单独的UI线程上或与事件队列+循环游戏状态机),一些导致事件套牌被重新洗牌并从中抽取,有些只是什么都不做。

我无法在Objective-C中进行任何类型的动态编程,因此我无法动态注入功能,这将是我明显的解决方案。

我想知道你采取什么样的方法来解决这个问题。我还概念化了一些其他解决方案,但它们看起来都比下一个更脆弱(在基于eventID的非重写函数中有巨大的切换案例等)

2 个答案:

答案 0 :(得分:1)

我对Objective-C了解不多,但在所有支持OOP的语言中,实例变量都是一个东西。您可以在其中存储各种属性,类方法可以将它们考虑在内,以确定要执行的逻辑类型。

因此,对于只有一个实例的类,将它们组成一个按类型和实例变量区分的类。这是一些伪代码来解释我的意思:

enum Action is (KillPlayer, ChangeState, NewEvent, Shuffle, Noop);

class Event
{
    Action revealAction;
    int actionArgument;

    function revealLocationEvent()
    {
        switch (this.revealAction)
        {
            case Action.KillPlayer:
                //kill the player
                break;
            case Action.ChangeState:
                //change the state to this.ActionArgument
                break;
            case Action.NewEvent:
                //create your new event
                break;
            case Action.Shuffle:
                //shuffle event deck
                break;
            case Action.Noop:
                //do nothing
        }
    }
}

我不一定认为短代码文件定义了许多类是不好的,但你的里程可能会有所不同。如果你想凝聚,这样的事情可能是一个解决方案。

答案 1 :(得分:1)

在Objective-C或Swift中,不是一个接一个地创建一个类,而是在创建实例时设置一个具有块属性/闭包属性的类。这是一种广泛使用的设计模式。

如果您认为它不是面向对象的,请向Apple抱怨。这就是现在如何使用通知的方法。