如何在实体对象之间建立逻辑关系?

时间:2014-04-02 21:23:37

标签: c# class oop

我有两个类,实体和关系,我想在所有实体之间定义任意类型的关系。除此之外,我不仅要在代码中创建两个实体之间的关系类型,还要在运行时定义两个实体之间的任何类型的关系,因此这需要灵活。我希望看到任何实体与任何实体的关系。所以我希望看到两个实体之间的所有关系,而不是同时定义它们。如果我说,例如男性A是女性B的兄弟它应该推断出B是A的姐妹,而没有明确地定义它。所以在C#中有一些Prolog功能。只是我无法弄清楚如何做到这一点。

编辑:我想要做的是定义人和关系,例如,罗马帝国开始的历史。所有主流家谱软件都没有解释像乱伦这样的事情,因此很难将罗伯特格雷夫斯的第一批罗马帝国人及其关系的传记映射到能够根据该王朝的任何成员生成家谱的模型中,我想利用某种我尚未发现的算法来做。所以请不要低估我。这是一个严肃的问题,我非常感谢任何能指出我正确方向的人。

1 个答案:

答案 0 :(得分:2)

以下是代表你们关系的类的原始观点:

public class Entity
{
    public Entity()
    {
        RelationsTo = new List<Relation>();
        RelationsFrom = new List<Relation>();
    }

    public string Name { get; set; }
    public List<Relation> RelationsTo { get; private set; }
    public List<Relation> RelationsFrom { get; private set; }
}

public class RelationKind
{
    public string Forwards { get; set; }
    public string Backwards { get; set; }
}

public class Relation
{
    public RelationKind Kind { get; set; }
    public Entity From { get; set; }
    public Entity To { get; set; }
}

关系类型的一个例子可能是:

var hasChild = new RelationKind { 
    Forwards = "is parent of", 
    Backwards = "is child of" 
};

这可以让你推断,如果某人是其他人的父母,那么这个人就是第一个人的孩子。

建立这样的关系:

var dad = new Entity { Name = "Dad" };
var joey = new Entity { Name = "Joey" };
var isDadOfJoey = new Relation { From = dad, To = joey, Kind = hasChild };
dad.RelationsTo.Add(isDadOfJoey);
joey.RelationsFrom.Add(isDadOfJoey);

但是我会创建一个自动连接的辅助方法。

public static void CreateRelation(Entity from, RelationKind kind, Entity to)
{
    var relation = new Relation { From = from, To = to, Kind = kind };
    from.RelationsTo.Add(relation);
    to.RelationsFrom.Add(relation);
}

你会这样称呼:

CreateRelation(dad, hasChild, joey);

此测试

Console.WriteLine("{0} {1} {2}",
    dad.Name,
    dad.RelationsTo[0].Kind.Forwards,
    dad.RelationsTo[0].To.Name);
Console.WriteLine("{0} {1} {2}",
    joey.Name,
    joey.RelationsFrom[0].Kind.Backwards,
    joey.RelationsFrom[0].From.Name);

打印

  爸爸是乔伊的父母   乔伊是爸爸的孩子