我使用Enumerations的方式有问题

时间:2012-08-07 17:42:44

标签: c#

public enum RelationType { Subclass, HasArm, HasLeg };
public RelationType RelationShipType { get; set; }

public static IOwlRelation AddSubClassRelation(IOwlClass parent, IOwlClass child)
{
    return new OwlRelation
    {
        Parent = parent,
        Child = child,
        RelationShipType = RelationType.Subclass
    };
}

所以让我们说这是在一个 OwlRelation 类中,现在在消费者类中我首先创建一个OwlRelation对象,就像说

OwlRelation r1 = OwlRelation.AddSubClassRelation( someParent, someChild);

并且还有像 AddRelation(OwlRelation)这样的方法,我可以将 r1 对象传递给它,现在在这个方法的正文中我可以查看看看是什么是此对象上的枚举值以及基于该值的一些内容。

所以这就是我在OwlRelation类中定义了Enumeration类型的原因。但我认为这不是正确的做法,而且我只是没有足够的专业知识来解决这个问题。那么您认为这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

您可以将不同的关系类型实现为不同的类。

public abstract class OwlRelation : IOwlRelation
{
    // Implement infrastructure common to all relation types
}

public SubclassOwlRelation : OwlRelation
{
    // Implement things specific to Subclass-relations
}

public HasArmOwlRelation : OwlRelation
{
    // Implement things specific to HasArm-relations
}

...

通过您的实现,您可能会遇到像这样的代码

switch (relation.RelationshipType) {
    case RelationshipType.Subclass:
        DoSomeSubclassStuff(relation);
        break;
    case RelationshipType.HasArm:
        DoSomeArmStuff(relation);
        break;
    case RelationshipType.HasLeg:
        DoSomeLegStuff(relation);
        break;
}

使用面向对象的方法,相应的代码看起来像这样

relation.DoSomeStuff();

答案 1 :(得分:1)

我不确定你要做什么。从另一个方向来看,使用enum的两种正确方法是:

  1. 您有一组相互排斥的值,其总数小于enum所基于的整数类型(int是默认值{{ 1}}是最大的可能),你可以合理地列出它们中的每一个(或者由于一些外部标准,期望用户知道与缺失项目相对应的数字)。

  2. 您有一组非互斥的值,您可以将这些值与二元运算符结合使用,以便在long为1,Read为2且Write为4,则读取和执行但不写入的能力为5(Execute)。

    < / LI>

    现在,我很长一段时间没有看过Web Ontology Language(我猜这是你的意思),但我看不出Arm和Subclass如何适应这一点(也不是记住关于OWL中武器的任何事情)。但是我也看不出它是如何融入其他任何东西的 - 我没有看到“它是手臂还是子类?”这个问题。是有意义的(哪个适合枚举使用1),也不是“它是一个手臂,一个子类,或两者兼有,还是两个都没有?”有意义(适合使用枚举2)。

    所以,答案并不多,但希望能够使用1 | 4来帮助我。

答案 2 :(得分:1)

我认为这是一个典型问题,它通过应用策略模式来解决。 因此@Olivier建议使用不同的RelationStrategy子类。 You can read about it here