utils.dl中的Dispatch是否存在遗漏
riijj opened this issue · 3 comments
riijj commented
代码如下:
Dispatch(simplename, descriptor, class, method) :-
!MethodInfo(_, simplename, _, class, _, descriptor, _),
DirectSuperclass(class, superclass),
Dispatch(simplename, descriptor, superclass, method),
!MethodModifier("abstract", method).
根据描述,如果rclass没有对应的方法实现,则需要去父类中寻找相同函数签名的方法,这里的父类是否应当包含非直接父类呢。这里的DirectSuperclass如果我没有理解错的话应该是指的是直接父类吧。
例如 a extend b , b extend c , c存在该方法。
那么改成如下的代码是否会好一些呢。
Dispatch(simplename, descriptor, class, method) :-
!MethodInfo(_, simplename, _, class, _, descriptor, _),
SubClass(class, superclass),
Dispatch(simplename, descriptor, superclass, method),
!MethodModifier("abstract", method).
ceclin commented
简单说可以理解成递归,一层一层地推导。我觉得原代码没有问题。
riijj commented
简单说可以理解成递归,一层一层地推导。我觉得原代码没有问题。
我的理解是DirectSuperclass和Dispatch是且的关系,也就是如果不满足DirectSuperclass那么就不会继续判断Dispatch了,应该就不存在递归的情况了
waderwu commented
以a extend b , b extend c
为例Dispatch(func, _, a, method) 会递归到Dispatch(func, _, b, method) 然后会递归到Dispatch(func, _, c, method) a和b 以及b和c 都是满足DirectSuperclass关系的.
结论是没有遗漏, 你可以构造你上面的那个例子, 然后输出Dispath的结果进行验证