C#中组合逻辑的if / else的替代方法

时间:2018-10-11 03:36:20

标签: c# if-statement polymorphism

我正在开发一个使用网格系统的程序。系统需要一种基于邻居的elementType的值对网格的每个元素起作用的方法。我目前使用的是以下内容:

enum ElementType{
    A,B
}

if (neighbourUp.elemType == ElementType.A && neighbourDown == ElementType.A){
    method1();
}

if (neighbourLeft == ElementType.A and current == ElementType.B){
    method2();
}

,依此类推。如您所见,当类型增加时,这很难管理。理想情况下,我想在这里使用多态性,但是我觉得为每种组合创建一个类都需要太多工作。在某些情况下,某些组合的方法也可能相同。

我想要一些有关如何解决此问题的建议。此外,ElementType还需要扩展以适应以后可能会添加的新类型。

3 个答案:

答案 0 :(得分:0)

您可以使用 行为模式 下的 策略设计模式 来避免基于以下代码执行代码条件 您可以使用这些链接来了解有关策略设计模式的更多信息

  1. https://www.dofactory.com/net/strategy-design-pattern

  2. https://www.youtube.com/watch?v=v9ejT8FO-7I

答案 1 :(得分:0)

将两个值都与键一起存储在数组中,然后在邻居和ElementType上申请循环,然后可以使用键值进行比较,直到数组中的项为止。

答案 2 :(得分:0)

我将定义一个规则列表,然后您的主代码会简单地在所有单元格周围循环,然后调用与某个单元格匹配的规则。然后,您将来可以相对轻松地添加或删除规则,而无需更改主循环逻辑。

因此,您需要一个代表规则的类,每个规则都指示与之匹配的左/右/上/下类型,然后有一个方法(如果发生匹配)被调用。使匹配字段为空,以便您可以指示是否不关心邻居的类型是什么。

class Rule
{ 
    public ElementType? Left { get; set; }
    public ElementType? Right { get; set; }
    public ElementType? Top { get; set; }
    public ElementType? Bottom { get; set; }
    public Action Process { get; set; }
}

...实际上,您的“过程”将需要至少一个参数,即对正在处理的单元格的引用。因此,您可以将其更改为Action或其他任何内容。