0

我有一个图,其中节点与 2 个关系相关:
subclassOf, partOf.

有一些节点具有一些属性。如果 B 是subclassOfA,则 B 继承 A 的属性,如果 D 是partOfC,则 C 继承 D 的属性。

我尝试了一些算法来推断所有节点属性,但我的程序挂起。

任何算法(蛮力)都可以做到这一点吗?

4

2 回答 2

0

假设 B 类从 A 继承,C 类从 B 继承,所以 C 类实际上也从 A 继承。

        A a = new A();
        B b = new B();
        C c = new C();

        if (b is A)
        {
            //True
        }
        if (c is B)
        {
            //True
        }
        if (c is A)
        {
            //True
        }
        if (a is B)
        {
            //False
        }
        A a1 = b as A;
        if (a1 != null)
        {
            //So a1 is b
        }
于 2013-08-19T05:13:09.917 回答
0

这是一个有向无环图(DAG),因为如果 B 是subClassOfA : A->B,则 A 是not subClassOfB 或属于 B 的任何类subClassOf。同样的规则也适用于partOf属性(D 是partOfC : D->C)。这意味着类之间没有循环依赖。

顺便说一句,在 OOP 世界中,partOf关系根本不意味着继承。所以通常如果 D isPartOfC,C 不会得到 D 的属性。可以使用诸如适配器模式之类的东西来获取它,但默认情况下 C encapsulatesD is all 是隐含的。

如果您正在编写一个查询函数来返回C您想要的类的所有属性,您可以使用递归并获取它。由于这是一个 DAG,递归将终止。如果错误地在关系图中存在循环,则递归将堆栈溢出。伪代码如下。

Properties propertyOf(c) {
    Properties p = c.localProperties; //Init to props defined specific to `C`
    foreach (var edge in edges(c)){
        if(dest(edge) == c){ //Only interested in `inflowing` edges.
            if( type(edge) == "subClassOf" || type(edge) == "partOf"){
                p.append( propertyOf ( source(edge) ) ) //Recurse further into source nodes
            }
        }        
    }
    return p
}
于 2013-08-20T15:06:05.627 回答