2012-08-07 57 views
0
方式
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 r1 = OwlRelation.AddSubClassRelation(someParent, someChild); 

创建OwlRelation对象,也有类似于AddRelation(OwlRelation)的方法,我可以将该对象传递给它,现在在此方法的主体中,我可以检查并查看此对象上的枚举值以及某些基于那个价值。

因此这就是我在OwlRelation类中定义Enumeration类型的原因。但我认为这不是正确的方式来证明这一点,而我只是没有足够的专业知识来解决这个问题。那么你认为这样做的正确方法是什么?

+3

我不明白你的问题是什么。这是一个公共的'enum',你在课堂上有一个属性。到现在为止还挺好。 – 2012-08-07 17:48:00

+2

不知道你想要实现的是什么 - 我不知道它看起来会很好。尽管我经常不把枚举放在同一个包含类的清单/分离类中,但是......举个例子,它至少应该做你想做的事。 – 2012-08-07 17:48:53

+0

好的谢谢,所以它很好!以及我不确定这是否是正确的设计。 – Bohn 2012-08-07 17:50:19

回答

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(); 
+0

我仍然不确定它们瞄准什么,但是+1,因为当enum和不同的子类都是可行的解决方案时,至少95%的时候,后者更好。 (在5%的情况下,并没有造成太多的痛苦,反之亦然)。 – 2012-08-07 18:00:03

1

我不知道你在做什么。从另一个方向,两个正确的方式来使用enum是:

  1. 你有一个互斥组值,总人数其中小于你是立足于enum整数型(int是默认设置,long是最大的可能),并且您可以合理列出其中的每一个(或者由于某些外部标准,期望用户知道与缺失项目对应的编号)。

  2. 您有一组不相互排斥的值,您可以将其与二元运算符结合使用,例如, Read是1,Write是2和Execute是4,则读取和超出的能力,但不写入是5(1 | 4)。现在

,我没有看过Web本体语言(我猜这就是那种你的意思是猫头鹰)在很长一段时间,但我没有看到手臂和子类如何适应这根本不记得任何有关OWL武器的事情。但我也没有看到它是如何适应其他任何东西的 - 我没有看到这个问题:“它是一个胳膊还是一个子类?”是有意义的(这将适合枚举使用1),也不是问题:“它是一个胳膊,一个子类,还是两者,或两者都不是?”是有意义的(这将适合枚举使用2)。

所以,没有太多的答案,但希望足够使用enum来帮助一下。

1

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