Inheritance 在继承和枚举之间选择
我拥有一级土地:Inheritance 在继承和枚举之间选择,inheritance,design-patterns,types,enums,choice,Inheritance,Design Patterns,Types,Enums,Choice,我拥有一级土地: class Land{ double latitude; double longitude; } 土地可以是三种类型之一——陡峭、平坦和潮湿。它们之间唯一的区别是——当一辆“坦克”造访这些土地时,它会根据土地类型产生不同的成本 现在,我是否应该创建LandType枚举: enum LandType{ STEEPY, PLAIN, WET } 并且,将其用作土地类别中的田地 或者,我应该创建3类衍生土地:陡坡地、平原、湿地?做出正确选择的决定因素是什么
class Land{
double latitude;
double longitude;
}
土地可以是三种类型之一——陡峭、平坦和潮湿。它们之间唯一的区别是——当一辆“坦克”造访这些土地时,它会根据土地类型产生不同的成本
现在,我是否应该创建LandType枚举:
enum LandType{
STEEPY, PLAIN, WET
}
并且,将其用作土地类别中的田地
或者,我应该创建3类衍生土地:陡坡地、平原、湿地?做出正确选择的决定因素是什么?如果类只是一个简单的数据结构,那么可以使用枚举:所有类型的土地都具有相同的属性,因此使用多态性不会增加价值 但是,如果湿地需要额外的特定属性,则可以使用继承来创建更专门的数据类型,从而启用多态性。 当
Land
将具有需要特定实现的操作或特定LandType
的特殊操作时也是如此,您应该使用继承
如果你需要扩展性考虑继承:未来的枚举不会改变,例如枚举的回放可以包含“下一个”、“前一个”和“当前”的值,它们不会改变,因为没有其他的。在这种情况下,使用枚举表示土地类型效果很好。但我们可以对许多不同的“土地类型”进行成像,因此更改或扩展枚举的可能性更大。为了避免对
LandType
进行这种修改,您可以实现一个新的子类型。例如,许多框架和库为它们的异常执行此操作:不是修改内部类以提供新标志,而是通过从公共基类型(例如Exception
)继承来强制提供自定义异常
在Land
对象上成像迭代,如果要排除Land
中LandType
为“湿”,则结果将为“陡峭”和“平坦”。但是,如果在LandType
enum中添加新值“Rocky”,并且不更改所有过滤器,则会得到“陡坡”、“平原”和“Rocky”。这可能会在不需要“Rocky”或应该排除“Rocky”的地方停止代码,就像从结果中排除“Wet”一样。您不希望在添加新的LandType
时更改现有代码。因此,一种新类型的Land
的具体实现将有助于避免破坏现有代码
编辑:
“…当一个“坦克”访问这些土地时,它会根据土地类型产生不同的成本”:因为你在询问设计,我向你推荐一些类似访问者模式的东西,以避免臃肿的开关语句。如果类只是一个普通的数据结构,你可以使用枚举:所有类型的土地共享相同的属性,因此,使用多态性不会增加价值 但是,如果湿地需要额外的特定属性,则可以使用继承来创建更专门的数据类型,从而启用多态性。 当
Land
将具有需要特定实现的操作或特定LandType
的特殊操作时也是如此,您应该使用继承
如果你需要扩展性考虑继承:未来的枚举不会改变,例如枚举的回放可以包含“下一个”、“前一个”和“当前”的值,它们不会改变,因为没有其他的。在这种情况下,使用枚举表示土地类型效果很好。但我们可以对许多不同的“土地类型”进行成像,因此更改或扩展枚举的可能性更大。为了避免对
LandType
进行这种修改,您可以实现一个新的子类型。例如,许多框架和库为它们的异常执行此操作:不是修改内部类以提供新标志,而是通过从公共基类型(例如Exception
)继承来强制提供自定义异常
在Land
对象上成像迭代,如果要排除Land
中LandType
为“湿”,则结果将为“陡峭”和“平坦”。但是,如果在LandType
enum中添加新值“Rocky”,并且不更改所有过滤器,则会得到“陡坡”、“平原”和“Rocky”。这可能会在不需要“Rocky”或应该排除“Rocky”的地方停止代码,就像从结果中排除“Wet”一样。您不希望在添加新的LandType
时更改现有代码。因此,一种新类型的Land
的具体实现将有助于避免破坏现有代码
编辑:
“…当一个“坦克”造访这些土地时,它会根据土地类型产生不同的成本”:因为你在询问设计问题,我向你推荐一些类似游客模式的东西,以避免浮夸的开关声明。土地的行为是什么?它有什么方法吗?不同类型的“土地”的功能完全不同吗?如果您使用enum,您会看到“If-else”或“switch case”吗?如果不使用enum,那么策略或组合可能更有用suitable@jaco0646编辑的问题:“它们之间唯一的区别是——当一辆“坦克”造访这些土地时,它会根据土地类型产生不同的成本。”土地的行为是什么?它有什么方法吗?不同类型的“土地”的功能完全不同吗?如果您使用enum,您会看到“If-else”或“switch case”吗?如果不使用enum,那么策略或组合可能更有用suitable@jaco0646编辑了这一问题:“它们之间唯一的区别是——当一辆“坦克”造访这些土地时,它会根据土地类型产生不同的成本。”