to: MooseWOler 既然Pascal是强类型的语言,而接口就是一种类型,那么它应该首先判断参数是否是符合B类型,从而选择第二个函数啊。-----我的疑问正在于此。
myInterface=interface['{85B0C2D5-6332-4047-BEF8-8D9C0FB7CCD0}'] procedure myFunc(a:myInterface); end; myClass=class(TObject,myInterface) procedure myFunc(a:myInterface); procedure myFunc(b:myClass); end; -------------------------------------------------------- procedure myClass.myFunc(a: myInterface); begin showmessage('This is Interface type'); end;procedure myClass.myFunc(b: myClass); begin showmessage('This is Class Type'); end; ---------------------------------------------------... var a1:myClass; b1:myInterface; b2:myClass; begin a1:=myClass.Create; b2:=myClass.create; b1:=b2;a1.myFunc(b1);//'This is Interface type' a1.myFunc(b2);//'This is Class Type'end; ... 看这里的代码就知道了,根据你传入这个A类实例声明类型进行选择的!!!
在Java和C++里也是一样
所以有理由认为在参数是一个a类的实例时,它会选择第一个函数.
关于object pascal的重载,在概念上和c++有些不同,也就是所谓的overload和override,这两个概念在c++中的区别并不明显.不过这并不妨碍我们讨论这个问题.
程序员要关心不是这个重载机制如何实现的(那样就变成了另外一种工作),我们只需要知道他让一个函数可以处理更多不同的情况.
既然Pascal是强类型的语言,而接口就是一种类型,那么它应该首先判断参数是否是符合B类型,从而选择第二个函数啊。-----我的疑问正在于此。
procedure myFunc(a:myInterface);
end; myClass=class(TObject,myInterface)
procedure myFunc(a:myInterface);
procedure myFunc(b:myClass);
end;
--------------------------------------------------------
procedure myClass.myFunc(a: myInterface);
begin
showmessage('This is Interface type');
end;procedure myClass.myFunc(b: myClass);
begin
showmessage('This is Class Type');
end;
---------------------------------------------------...
var
a1:myClass;
b1:myInterface;
b2:myClass;
begin
a1:=myClass.Create;
b2:=myClass.create;
b1:=b2;a1.myFunc(b1);//'This is Interface type'
a1.myFunc(b2);//'This is Class Type'end;
...
看这里的代码就知道了,根据你传入这个A类实例声明类型进行选择的!!!
例:
Func(a:Integer);
Func(B:String);
当Func(2)调用Func(a:integer);
当Func('asdfa')调用Func(B:String);
是静态编译时决定的