成员与另一个班级的公共变量

时间:2016-04-23 02:36:41

标签: java c# oop enums

我有一种情况,我觉得我做错了什么,我怀疑有更多有效的方法可以做。

我有一个包含一些变量的类:

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编程语言。

感谢。

2 个答案:

答案 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);