Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 面向对象方法-子类修改父类_C#_Oop - Fatal编程技术网

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

C# 面向对象方法-子类修改父类,c#,oop,C#,Oop,我有一个关于面向对象设计的问题-我有两个类,一个地图(实际上是一个x,y网格)和放置在地图上的项目。地图包含所有项目及其位置,并控制程序流程。这些物品具有一定的智能,可以确定玩家是否希望在地图上四处移动 例如,地图代码可能如下所示: class Map { ... Items[,] map; public void DoItemUpdate() { ... for (x = 0 to MaxX) {

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

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

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?
    }
}
项目代码可能如下所示:

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?
    }
}
基本上,我试图解决的是如何构造移动代码,以便它询问地图移动是否合法,然后在地图中注册移动

我想到了几种方法

  • 将对父映射类的引用传递给该项,并从中调用函数
  • 使用委托/事件结构“回调”映射
  • 对这些方法有何评论?对于OO代码,什么是最好的/最干净的/最合适的?
    谢谢

    都不是。我将向Items(应该是Item?)类添加一个方法:

    定义一个常量值,该项可以返回该常量值以指示它不希望被移动。(0,0)如果返回值指示增量,或(-1,-1)如果返回值指示绝对位置。或者,如果您不想定义一个神奇的值:

    bool TryGetMoveRequest(out Vector2 request);
    
    优点:

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


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

    由于项目的位置是项目的属性,因此该位置可能属于项目,而不是地图。当你移动当前物品时,你需要知道其他物品的位置吗?你是正确的-物品可能会保持该位置。。。复杂的是,如果该位置有另一个项目,则移动不应发生,因此实际上项目需要在移动之前询问地图是否可以移动。请记住,获取评估的顺序会影响系统的行为。是的,但通过将移动请求与移动操作分离,在收集请求和执行移动之间,您可以适当地调整顺序。感谢Anthony-解释一下,项可以存储移动请求队列,映射可以通过项对其进行评估。TryGetMoveRequest(out…),建立合法性并调用方法,如Item.PerformMove()?