我有一种情况,我觉得我做错了什么,我怀疑有更多有效的方法可以做。
我有一个包含一些变量的类:
public class Structure {
public float size;
public float pos_x;
public float pos_y;
public float pos_z;
}
我有这些成员的枚举,与上述字段完全相同:
public enum StructureProperty {
SIZE,
POS_X,
POS_Y,
POS_Z,
}
我有AnotherClass需要存储单个StructureProperty及其相关值。
public class AnotherClass {
public StructureProperty property;
public float value;
public float ID;
public float parentID;
..some methods and things
}
我有一个方法来抓取这个其他类,并查看使用枚举更新哪个属性:
void UpdateStructure (AnotherClass anotherClassInstance) {
switch (anotherClassInstance.property) {
case StructureProperty.SIZE:
Structure.size += anotherClassInstance.value;
break;
... for all other cases
but the logic might be different
(not always +=, sometimes several lines)
}
此方法需要检查以查看结构中要更新的属性,然后更新它。我觉得我可能会破坏某种面向对象的方法,因为我需要在结构中维护一个枚举列表和一个变量列表。请注意,我预计在构建程序时经常添加和删除属性。希望有人能够以正确的方式引导我使这些代码更具有前瞻性。
我在c#编程,但我认为这个问题适用于所有主要的OO编程语言。
感谢。
答案 0 :(得分:2)
我从Java的角度回答这个问题。我相信c#会有类似的结构。我没有看到维护Structure类和StructureProperty枚举的必要性。假设需要在运行时修改这些属性,并且没有将它们存储在属性文件中的用例,我认为Structure和StructureProperty可以合并为一个枚举。
以下是你如何思考这个方向:
public class StructurePropertyExample {
private static enum StructureProperty {
SIZE(0.0f), POS_X(0.0f), POS_Y(0.0f), POS_Z(0.0f);
private float value;
private StructureProperty(float value) {
this.value = value;
}
public float getValue() {
return value;
}
public void setValue(float value) {
this.value = value;
}
};
public static void main(String[] args) {
float newValue = 1.23f;
for (StructureProperty property : StructureProperty.values()) {
switch (property) {
case SIZE: property.setValue(newValue);
break;
case POS_X : // similar as above
case POS_Y :
case POS_Z :
}
}
}
}
如果我们讨论不同的数据类型,可以更改枚举以保存包装的对象,如下所示:
private static enum StructureProperty {
SIZE, POS_X, POS_Y, POS_Z;
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
};
答案 1 :(得分:1)
就我个人而言,我没有发现您的Sturcture课程和定义枚举的问题。我发现AnotherClass有问题,即它包含可能永远不会使用的不必要的属性,具体取决于您的StructureProperty枚举。因此,我宁愿将此AnotherClass分解为specefic StructureUpdater类,并实例化特定的Updater类(可能通过使用Factory)来更新Structure。
另一种方法是在Structure类本身上编写扩展方法,以便像
一样更新它public static class StructureExtensions
{
public static void UpdateSize(this Structure structure, float size)
{
structure.size += size;
}
public static void UpdateX(this Structure structure, float x)
{
structure.pos_x += x;
//any other update on strucutre
}
}
然后你可以直接在结构本身上使用它们
Structure structure = new Structure();
structure.UpdateSize(123);
structure.UpdateX(34);