Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance 在继承和枚举之间选择_Inheritance_Design Patterns_Types_Enums_Choice - Fatal编程技术网

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编辑了这一问题:“它们之间唯一的区别是——当一辆“坦克”造访这些土地时,它会根据土地类型产生不同的成本。”