这是关于OOP概念的问题。
假设我正在创建一个游戏而且我有一些对象:
现在我知道玩家可以用铁锹挖掘一个场地了。而这个动作将是其中一个类的方法。是否有一些规则来确定哪些类应具有此方法。
此操作最明显的表现是播放器(User),因此User类可以使用digField(Field字段)等方法。但实际上字段本身受这个动作的影响最大,所以可能它是Field类方法,比如dig(User performer)或dig(Item toolUsed)。或者,Item本身应该有一个类似Tool的子类,其方法类似于digField(Field field)。
有很多方法可以解决这个问题,我只是想知道那里是否有某种简单的最佳实践。
答案 0 :(得分:1)
这取决于游戏的其余部分。你不能在不考虑所有课程的情况下构建课程。所以问题如:
在布置课程之前,要考虑这些类型的问题。例如,如果您有许多不同的工具,那么您可以将挖掘与铲子联系起来,这将详细说明它对不同类型的土地(以及它可以使用哪些土地)的作用。然后也许有一台拖拉机,它可以做一些与陆地不同的东西。
最后一想,你的课程越接近现实世界,课程的扩展越好。换句话说,如果你向一个从未见过的人描述一把铲子,你的班级应该在那种描述之后进行自我塑造。
答案 1 :(得分:1)
就像在其他答案中所说的那样,这取决于发生了什么(或将来会发生)。
例如,挖掘可以有一些选择:
但是,在大多数情况下,需要设置多个状态/更改。所以也许最好创建一个单独的类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
祝你好运