1. 程式人生 > >Check類中的union,excl,diff,intersect

Check類中的union,excl,diff,intersect

unless empty ext img union 關系 else for ()

定義一些類,這些類之間有父子關系,如下:

class Father{}
class Son1 extends Father{}
class Son2 extends Father{}

class Top{}
class Middle extends Top{}
class Bottom extends Middle{}

1、incl()方法

技術分享圖片

源代碼如下:

/** Add type set to given type list, unless
 *  it is a subclass of some class  in the list.
 */
public List<Type> incl(Type t, List<Type> ts) {
    List<Type> result;
    // 如果t是ts列表中一些類的子類,則返回這個ts
    if(subset(t,ts)){
        result = ts;
    }else{
        // 如果ts列表中有些類是t的子類,則從ts列表中移除這些子類,
        // 然後追加t後將這個ts列表返回
        List<Type> temp = excl(t, ts);
        result = temp.prepend(t);
    }
    return result;
}

  

2、excl()方法  

技術分享圖片

源代碼如下:

/** Remove type set from type set list.
 */
// 如果ts列表中有些類是t的子類,則從ts列表中移除這些子類後返回,
// 如果ts列表為空,表示沒有可移除的或者說已經全部被移除完了,
// 直接返回ts空列表
public List<Type> excl(Type t, List<Type> ts) {
    if (ts.isEmpty()) {
        return ts;
    } else {
        // 需要清楚知道List<Type>這個類型的實現機制
        List<Type> ts1 = excl(t, ts.tail); // 遞歸
        // 當ts.head是t的子類時,移除這個ts.head,返回ts.tail
        // 處理後的結果
        if (types.isSubtypeCapture(ts.head, t)) {
            return ts1;
        }
        // 當ts.head沒有成為t的子類時,則列表中不需要移除
        // 這個ts.head,直接返回ts
        else if (ts1 == ts.tail) {
            return ts;
        }
        // 當ts.head沒有成為t的子類時且ts.tail處理結果也有變動,
        // 則追加ts.head到ts1後返回
        else {
            return ts1.prepend(ts.head);
        }
    }
}

  

3、並集union()方法

技術分享圖片

源代碼如下:

/** Form the union of two type set lists.
 */
public List<Type> union(List<Type> ts1, List<Type> ts2) {
    List<Type> ts = ts1;
    for (List<Type> l = ts2; l.nonEmpty(); l = l.tail) {
        ts = incl(l.head, ts);
    }
    return ts;
}

  

4、差集diff()方法

技術分享圖片

源代碼如下:

/** Form the difference of two type lists.
 */
// 如果ts1列表有些類是ts2列表中某些類的子類,則從ts1
// 列表中移除這些子類,最後返回ts1中剩余的類
public List<Type> diff(List<Type> ts1, List<Type> ts2) {
    List<Type> ts = ts1;
    for (List<Type> l = ts2; l.nonEmpty(); l = l.tail) {
        ts = excl(l.head, ts);
    }
    return ts;
}

  

5、交集intersect()方法

技術分享圖片

源代碼如下:

/** Form the intersection of two type lists.
 */
// 如果有ts1列表中含有Father類型,而ts2中含有Father的
// 子類Sub1,Sub2 時,最終返回Sub1,Sub2,表示這個
// Father類型能夠catch那兩個子類型
public List<Type> intersect(List<Type> ts1, List<Type> ts2) { // todo
    List<Type> ts = List.nil();
    for (List<Type> l = ts1; l.nonEmpty(); l = l.tail) {
        if (subset(l.head, ts2)) {
            ts = incl(l.head, ts);
        }
    }
    for (List<Type> l = ts2; l.nonEmpty(); l = l.tail) {
        if (subset(l.head, ts1)) {
            ts = incl(l.head, ts);
        }
    }
    return ts;
}

  

Check類中的union,excl,diff,intersect