我在Unity3D问答网站上问了一个类似的问题,但没有得到回应。我终于回到了这个项目,仍然有同样的问题。
与统一问题的链接
我已经搜索过了,但我认为我没有找到正确的关键字,因为我仍然没有找到一个合适的答案。无论如何,我会以不同的方式来问这个问题,希望有人能给我指明正确的方向。
下面是我想出的代码,它不是游戏中的实际代码,但它很好地展示了我的问题。
基本上,在build()方法中,我希望检查这两个列表都包含相同类型的工具,而不需要对该类型进行实际的硬编码。我不关心特定的工具实例,只是它是特定类型的。其目的是,我可以创建新的工具,而不必修改构建方法来合并这些新类型。
如果有更好的方法做这件事,我会全神贯注的。
谢谢
namespace TypeExample
{
class Tool
{
}
class Spanner : Tool
{
}
class Wrench : Tool
{
}
class Builder
{
List<Tool> toolsAvailable = new List<Tool>();
List<Tool> toolsRequired = new List<Tool>();
public Builder()
{
Spanner spanner = new Spanner();
Wrench wrench = new Wrench();
toolsRequired.Add(spanner);
toolsRequired.Add(wrench);
}
public void GiveTool(Tool tool)
{
toolsAvailable.Add(tool);
}
public void build()
{
// if true
Console.WriteLine("Building");
// else
Console.WriteLine("I don't have the tools to build!");
}
}
class Program
{
static void Main(string[] args)
{
Spanner spanner = new Spanner();
Wrench wrench = new Wrench();
Builder builder = new Builder();
builder.GiveTool(spanner);
builder.GiveTool(wrench);
builder.build();
Console.ReadLine();
}
}
}发布于 2014-05-11 09:27:15
基本上,您应该使用林克从集合中获取所有类型,然后使用compair获取结果。
var toolsAvailableTypes = toolsAvailable.Select(t => t.GetType()).Distinct();
var toolsRequiredTypes = toolsRequired.Select(t => t.GetType()).Distinct();
if (toolsRequiredTypes.Except(toolsAvailableTypes).Any())
{
//building
}目前尚不清楚,您是否也应补充仅限型号或数量的仪器。我的回答假设你不关心数量,当你需要两个spanner的时候,你可以用一个进行构建。
-Update
为了满足子类的要求(Sriram Sakthivel提到过),您可以检查可用的工具类型是否是必需的工具类型的子类,这样您就可以在需要SpecialSpanner时使用任何Spanner。
var toolsAvailableTypes = toolsAvailable.Select(t => t.GetType()).Distinct().ToList();
var toolsRequiredTypes = toolsRequired.Select(t => t.GetType()).Distinct().ToList();
if (CanBuild(toolsAvailableTypes, toolsRequiredTypes))
{
Console.WriteLine("building");
}
else
{
Console.WriteLine("not enough minerals");
}CanBuild方法:
bool CanBuild(List<Type> toolsAvailableTypes, List<Type> toolsRequiredTypes)
{
foreach (var requiredType in toolsRequiredTypes)
{
bool isAvailable = toolsAvailableTypes.Any(availableType => availableType.IsSubclassOf(requiredType) || availableType == requiredType);
if (!isAvailable)
{
return false;
}
}
return true;
}发布于 2014-05-11 09:29:02
var reqdTypes = toolsRequired.Select(x => x.GetType());
var availableTypes = toolsAvailable.Select(x => x.GetType());
if (reqdTypes.Except(availableTypes).Any())
{
//Something exist in reqdTypes which is not in availableTypes
}注意:如果提供比预期类型更多的派生类型,这将失败。例如,如果您提供SpecialSpanner就位或Spanner,这将无法工作。
https://stackoverflow.com/questions/23590891
复制相似问题