我使用枚举的方式有问题
本文关键字:方式 有问题 枚举 | 更新日期: 2024-11-07 01:50:12
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
};
}
因此,假设这是在OwlRelations类中,现在首先在消费者类中,我通过说像这样创建一个OwlRelations对象。
OwlRelation r1 = OwlRelation.AddSubClassRelation( someParent, someChild);
并且还有一个像 AddRelation(OwlRelation) 这样的方法,我可以将该 r1 对象传递给它,现在在此方法的主体中,我可以检查并查看此对象上的枚举值是什么以及基于该值的一些东西。
这就是我在 OwlRelation 类中定义枚举类型的原因。 但我认为这不是实现这一目标的正确方法,而且我只是没有足够的专业知识来弄清楚。那么,您认为这样做的正确方法是什么?
您可以将不同的关系类型实现为不同的类。
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();
我不确定你想做什么。从另一个方向来看,使用enum
的两种正确方法是:
- 您
有一组互斥的值,其总数小于您基于
enum
的整数类型(int
是默认值,long
是可能的最大值),您可以合理地列出每个值(或期望用户知道与缺失项目对应的数字, 由于某些外部标准)。您有一组非互斥值,您可以将其与二元运算符结合使用,以便例如
Read
是1,Write
是2,Execute
是4,那么读取和超越的能力,但不写入的能力是5(1 | 4
)。
现在,我已经很久没有看过Web本体语言了(我猜这就是你的意思是OWL),但我完全看不出Arm和Subclass如何适应它(也不记得OWL中的武器)。但我也不明白它如何适应其他任何东西 - 我既不认为"它是一个手臂,还是一个子类?"这个问题有意义(适合枚举使用1),也没有问题"它是一个手臂,一个子类,还是两者兼而有之,或者两者都不是?"是有意义的(适合枚举使用2)。
所以,答案不多,但希望使用enum
来提供帮助。
我认为这是一个典型的问题,可以通过应用策略模式来解决。因此,正如@Olivier所建议的那样,RelationStrategy
子类会有所不同。你可以在这里阅读它