|
2. 就是对多态的支持,也可能不是通过虚函数来处理了,而是通过类型判断采用条件语句来实现方法的调用。就比如下面Swift语言源代码和C语言伪代码:
- ////////Swift源代码
-
- //基类
- class CA{
- @inline(never)
- open func foo(){}
- }
-
- //派生类
- class CB:CA{
- @inline(never)
- override open func foo(){}
- }
-
- //全局函数接收对象作为参数
- @inline(never)
- func testfunc(_ obj:CA){
- obj.foo()
- }
-
-
- func main() {
- //对象的创建以及方法调用
- let objA = CA()
- let objB = CB()
- testfunc(objA)
- testfunc(objB)
- }
- ////////C伪代码
-
- //...........................................运行时定义部分
-
-
- //Swift类描述
- struct swift_class {
- ... //其他的属性,因为这里不关心就不列出了
- //这里也没有虚表的信息。
- };
-
-
- //...........................................源代码中类的定义和方法的定义和实现部分
-
- //类定义
- struct CA {
- struct swift_class *isa;
- };
-
- struct CB {
- struct swift_class *isa;
- };
-
- //Swift类的方法的实现
- //基类CA的foo方法实现
- void fooForA(){}
- //派生类CB的foo方法实现
- void fooForB(){}
- //全局函数方法的实现
- void testfunc(CA *obj)
- {
- //这里并不是通过虚表来进行间接调用而实现多态,而是直接硬编码通过类型判断来进行函数调用从而实现多态的能力。
- asm("mov x20, obj");
- if (obj->isa == &classCA)
- fooForA();
- else if (obj->isa == &classCB)
- fooForB();
- }
-
- //类的描述信息构建,这些都是在编译代码时就明确了并且保存在数据段中。
- struct swift_class classCA;
- struct swift_class classCB;
-
- //...........................................源代码中程序运行的部分
-
- void main() {
- //对象实例创建以及方法调用的代码。
- CA *objA = CA.__allocating_init(classCA);
- objA->isa = &classCA;
- CB *objB = CB.__allocating_init(classCB);
- objB->isa = &classCB;
- testfunc(objA);
- testfunc(objB);
- }
(编辑:PHP编程网 - 金华站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|