在QL中的类和我们常见的编程语言中的类区别很大。
在QL中:
1、一个type表示一个数值集合
2、一个值可以属于多个集合,即一个值可以拥有多个type
3、class是type的一种,即一个class表示一个数值集合
例如类型int表示整数的数值集合。
现在我们定义一个类OneTwoThree继承自int类型,并限定OneTwoThree类型的数值集合中的成员有整数1,2,3。
并定义了一个谓词getAString,用来输出一个字符串和当前成员的数值。
现在我们增加继承了OneTwoThree的类OneTwo,并限定OneTwo类型的数值集合中的成员有1,2。
并重写谓词getAString,用来输出一个字符串和当前成员的数值。
现在我们增加继承了OneTwoThree的类TwoThree,并限定TwoThree类型的数值集合中的成员有2,3。
并重写谓词getAString,用来输出一个字符串和当前成员的数值。
OneTwoThree继承了int类型,那么QL解释器会认为OneTwoThree类型比int类型更具体;
OneTwo继承了OneTwoThree,那么QL解释器会认为OneTwo类型比OneTwoThree类型更具体;
TwoThree继承了OneTwoThree,那么QL解释器会认为TwoThree类型比OneTwoThree类型更具体,TwoThree类型与OneTwo类型一样具体。
from OneTwoThree temp
select temp.getAString()
声明OneTwoThree类型的变量temp,此时temp表示OneTwoThree类型的数值集合,集合成员包括1,2,3。
当temp=1时,在调用getAString谓词时,发现OneTwo重写了谓词getAString,因为OneTwo集合比OneTwoThree集合更具体,所以会调用OneTwo集合的getAString谓词,因此会输出:
One or Two:1
当temp=2时,在调用getAString谓词时,发现OneTwo和TwoThree都重写了谓词getAString,因为OneTwo集合与TwoThree集合具有相同的具体等级,所以会同时调用OneTwo集合和TwoThree集合的getAString谓词,因此会输出:
One or Two:2 Two or Three:2
当temp=3时,在调用getAString谓词时,发现TwoThree重写了谓词getAString,因为TwoThree集合比OneTwoThree集合更具体,所以会调用TwoThree集合的getAString谓词,因此会输出:
Two or Three:3
总结
在CodeQL中类表示一个数值集合。
A类继承了B类,那么A类属于B类,A类表示的数值集合属于B类表示的数值集合;
A类表示的数值集合比B类表示的数值集合更具体,A类比B类更具体;
在调用成员谓词时,会调用最具体的那个成员谓词,如果被多个子类重写,那么便会依次调用最具体的且级别一样的子类成员谓词。