在继承和枚举之间进行选择



我有班级土地:

class Land{
    double latitude;
    double longitude;
}

土地可以是三种类型之一 - 陡峭,朴素和潮湿。其中唯一的区别是 - 当"坦克"访问这些土地时,它会根据土地类型产生不同的成本。

现在,我应该创建LandType枚举:

enum LandType{
    STEEPY, PLAIN, WET
}

并将其用作土地类中的字段?

或者,我应该创建3种派生的土地类别:陡峭的山地,普莱兰,湿地?做出正确选择的决定因素是什么?

如果类只是一个普通的数据结构,则可以使用枚举:各种土地共享相同的属性,因此使用多态性不会增加价值。

但是,例如湿土地需要额外的特定属性,而不是使用继承来创建更专业的数据类型,从而实现了多态性。当Land的操作需要特定实现或对某些LandType特别特殊时,您应该使用继承。

另外,如果您需要可扩展的性能考虑继承:将来会有一些枚举不会改变,例如枚举"播放"可以包含值"下一步","上一个"one_answers"当前",并且它们不会改变,因为没有其他值。在这种情况下,使用枚举表达土地类型的效果很好。但是,我们可以对许多不同的" Landtypes"进行想象,因此更可能发生枚举或扩展枚举。为了避免对LandType的修改,您可以实现新的子类型。例如,许多框架和库都是为此做到的:而不是修改内部类以提供新标志,而不是通过从公共基础类型继承来提供自定义异常,例如Exception

Land对象上进行成像迭代,您要排除LandType为"湿"的任何Land,结果将是'Supepy'和'Pline'。但是,当在LandType枚举中添加一个新的值"岩石",并且不要更改所有过滤器时,您会得到"陡峭","普通"one_answers"岩石"。这可能会在任何地方刹车您的代码,而"岩石"不会被期望或不得排除,就像您从结果中排除了"湿"。您不想在添加新的LandType时更改现有代码。因此,新型Land的特定实现将有助于避免破坏现有代码。

编辑:" ...当"坦克"访问这些土地时,它会根据土地类型产生不同的成本。Div>

最新更新