gpt4 book ai didi

c# - 面向对象方法论——子类修改父类

转载 作者:行者123 更新时间:2023-11-30 22:45:12 27 4
gpt4 key购买 nike

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

例如 map 代码可能如下所示:

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?
}
}

基本上,我正在努力解决的是应该如何构建移动代码,以便它询问 map 移动是否合法,然后在 map 中注册移动。

我想到了几个方法

  1. 将对父 Map 类的引用传递给 Item 并从那里调用一个函数
  2. 使用委托(delegate)/事件结构来“回调” map

关于这些方法的任何评论 - 什么是最好/最干净/最适合 OO 代码的?谢谢!

最佳答案

都没有。我会向您的项目(应该是项目吗?)类添加一个方法:

Vector2 GetMoveRequest();

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

bool TryGetMoveRequest(out Vector2 request);

优点:

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

此外,您的 Map 类中的逻辑会变得越来越复杂。考虑一个场景,其中一个项目的移动可能会阻止另一个项目的移动,或者被另一个项目的移动阻止。使用您列出的任何一种方法都很难实现这一点。

关于c# - 面向对象方法论——子类修改父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3162685/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com