面向对象的方法 - 修改父类的子类

时间:2010-07-02 01:11:52

标签: c# oop

我有一个面向对象设计的问题 - 我有两个类,一个 Map (实际上是一个x,y网格)和 Items 放在地图上。地图包含所有项目及其位置,并控制程序流程。物品有一些智能,并确定是否希望在地图上移动。

例如,地图代码可能如下所示:

class Map
{
    ...
    Items[,] map;

    public void DoItemUpdate()
    {
        ...
        for (x = 0 to MaxX)
        {
            for (y = 0 to MaxY)
            {
                    map[x,y].UpdateItem();
            }
        }
    }
}

项目代码可能如下所示:

class Items
{
    ...
    Vector2 location;

    public void UpdateItem()
    {
        // determine if we want to move the unit
        ....

        // if yes, move the unit
        this.Move(fromXY, toXY);
    }

    public void Move(Vector2 from, Vector2 to)
    {
        // what goes in here - raise event, use reference to Map class?
    }
}

基本上我正在努力解决的问题是如何构建移动代码,以便在移动是合法的时候询问地图,然后在地图中注册移动。

我想到了几种方法

  1. 将对父Map类的引用传递给Item并从那里调用函数
  2. 使用委托/事件结构“回调”地图
  3. 对这些方法的任何评论 - 对OO代码最好/最干净/最合适的是什么? 谢谢!

1 个答案:

答案 0 :(得分:3)

都不是。我会为你的Items添加一个方法(应该是Item?)class:

Vector2 GetMoveRequest();

定义Item可以返回的常量值,表示不想移动它。 (0,0)如果返回值表示增量,或者(-1,-1)如果返回值表示绝对位置。或者,如果您不想定义魔术值:

bool TryGetMoveRequest(out Vector2 request);

优点:

您现在已经在两个类中适当地分离了移动逻辑。该项目知道是否要移动,如果是,那么。 Map可以评估移动的合法性,然后根据您的逻辑执行或忽略Item的移动请求。没有引用处理,没有笨拙的回调机制。

此外,Map类中的逻辑将能够增加复杂性。考虑一个场景,其中一个项目的移动可能会阻止或被另一个项目的移动阻止。使用您列出的任何一种方法都很难实现。