如何确定哪个类应该具有指定的方法

时间:2016-07-22 14:42:56

标签: oop

这是关于OOP概念的问题。

假设我正在创建一个游戏而且我有一些对象:

  • 字段 - 代表地图上的某个字段。
  • 用户 - 代表玩家。
  • 项目 - 表示用户可以拥有的项目(例如铲子)

现在我知道玩家可以用铁锹挖掘一个场地了。而这个动作将是其中一个类的方法。是否有一些规则来确定哪些类应具有此方法。

此操作最明显的表现是播放器(User),因此User类可以使用digField(Field字段)等方法。但实际上字段本身受这个动作的影响最大,所以可能它是Field类方法,比如dig(User performer)或dig(Item toolUsed)。或者,Item本身应该有一个类似Tool的子类,其方法类似于digField(Field field)。

有很多方法可以解决这个问题,我只是想知道那里是否有某种简单的最佳实践。

3 个答案:

答案 0 :(得分:1)

这取决于游戏的其余部分。你不能在不考虑所有课程的情况下构建课程。所以问题如:

  1. 是否有很多工具,他们是否对不同的对象执行不同的操作?
  2. 是否有许多类型的土地(田地,溪流等)
  3. 用户是否对动作
  4. 有任何影响(例如力量)

    在布置课程之前,要考虑这些类型的问题。例如,如果您有许多不同的工具,那么您可以将挖掘与铲子联系起来,这将详细说明它对不同类型的土地(以及它可以使用哪些土地)的作用。然后也许有一台拖拉机,它可以做一些与陆地不同的东西。

    最后一想,你的课程越接近现实世界,课程的扩展越好。换句话说,如果你向一个从未见过的人描述一把铲子,你的班级应该在那种描述之后进行自我塑造。

答案 1 :(得分:1)

就像在其他答案中所说的那样,这取决于发生了什么(或将来会发生)。

例如,挖掘可以有一些选择:

  • user.digField(字段,工具):这种方式在您的用户还需要花费时间或者可能会感到疲倦时会很有帮助,例如,如果您想要聚焦用户,请使用这种方式。
  • field.dig(用户,工具):这种方式可以在关注字段本身时提供帮助,例如设置字段的状态。
  • tool.dig(用户,字段):这种方式可用于更改,例如工具的状态或所需的维护。

但是,在大多数情况下,需要设置多个状态/更改。所以也许最好创建一个单独的类Action,如:

public class Action
{
    public void DigField(User user, Location location, Tool tool)
    {
        user.Status = Digging;
        user.Energy -= 50;
        location.Status = Digging;
        tool.Status = Digging;
        tool.Usage++;
    }
}

正如您所看到的,此功能可能会随着动作变得更加复杂而增长。那么在适当的类中调用单独函数的好方法是什么,比如mix:

public class Action
{
    public void DigField(User user, Location location, Tool tool)
    {
        user.DigField();
        location.Dig();
        tool.Dig();
    }
}

public class User
{
    public void DigField()
    {
        Status = Digging; 
        Energy -= 50;
    }
}

public class Field
{
    public void Dig() 
    { 
         Status = Digging; 
    }
}

public class Tool
{
    public void Dig()
    {
          Status = Digging;
          Usage++;
    }
}

这有利于保持其所属的功能。

没有什么可以阻止你传递参数,比如如果用户的能量消耗取决于场的类型,请使用:

public class User
{
    public void DigField(Field field)
    {
        Status = Digging; 
        Energy -= field.Type == Clay ? 30 : 20;
    }
}

答案 2 :(得分:0)

这不是一个超载的情况,我认为你已经认识到复杂性,但你正试图逃避它。你现在花时间去模拟它,以后可能会很昂贵。

以下是我的想法:

用户对象执行操作,因此它必须具有User.Dig()方法。也许你可以决定传入一个Item对象(例如Shovel)。

字段对象对User对象的动作(Dig)作出反应。你现在必须确定这个反应是什么。您还可以确定操作是什么。

就像你说的那样,可能有很多方法,我认为游戏引擎已经解决了这样的问题,但我不能使用它们,所以我无法推荐。如果我要模拟解释我首先尝试Observable Pattern https://en.wikipedia.org/wiki/Observer_pattern?wprov=sfla1

祝你好运