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 对象,如下所示

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

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

就是我在 OwlRelation 类中定义 Enumeration 类型的原因。但我认为这不是实现这一目标的正确方法,而且我可能没有足够的专业知识来解决这个问题。那么您认为正确的做法是什么?

4

3 回答 3

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();
于 2012-08-07T17:54:59.113 回答
1

我认为这是一个典型的问题,通过应用策略模式来解决。RelationStrategy因此,正如@Olivier 所建议的那样 ,它将是不同的子类。你可以在这里读到它

于 2012-08-07T18:09:12.450 回答
1

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

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

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

现在,我已经很长时间没有看过 Web Ontology Language(我猜这就是你的意思的那种 OWL),但我根本不知道 Arm 和 Subclass 是如何适应这个的(也不记得任何关于OWL 中的武器)。但我也看不到它如何适合其他任何东西——我也看不到“它是手臂还是子类?”的问题。是有道理的(这将适合枚举使用 1),也没有问题“它是一个手臂、一个子类,还是两者兼而有之,或者两者都不是?” 是有道理的(这将适合枚举使用 2)。

所以,没有太多的答案,但希望足以enum帮助一点。

于 2012-08-07T17:54:12.497 回答