一个类A,他实现了一个接口B。
另有两个重载函数:Func(a: A)
                  Func(b: B)
请问,如果将一个A类的实例传入Func函数,他应该进入哪一个函数体?

解决方案 »

  1.   

    这个我猜是调用Func(a: A).因为调用接口的那个函数时,要把A对象as 成接口B.明显没有第一个函数匹配得好。就好像Func(AiInteger: Integer)和函数Func(AiShort: SmallInt)一样,如果传入一个SmallInt,则调用第二个SmallInt类型直接匹配的函数.
      

  2.   

    编译器会进入他认为最匹配的那个, 而那个最匹配的就是Func(a: A);
      

  3.   

    应该是最匹配的那个,
    在Java和C++里也是一样
      

  4.   

    pascal是强类型(strongly type)的语言
    所以有理由认为在参数是一个a类的实例时,它会选择第一个函数.
    关于object pascal的重载,在概念上和c++有些不同,也就是所谓的overload和override,这两个概念在c++中的区别并不明显.不过这并不妨碍我们讨论这个问题.
    程序员要关心不是这个重载机制如何实现的(那样就变成了另外一种工作),我们只需要知道他让一个函数可以处理更多不同的情况.
      

  5.   

    to: MooseWOler
    既然Pascal是强类型的语言,而接口就是一种类型,那么它应该首先判断参数是否是符合B类型,从而选择第二个函数啊。-----我的疑问正在于此。
      

  6.   

    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类实例声明类型进行选择的!!!
      

  7.   

    根据你的调用的函数传进去的参数决定。
    例:
      Func(a:Integer);
      Func(B:String);
    当Func(2)调用Func(a:integer);
    当Func('asdfa')调用Func(B:String);
      

  8.   

    Func(a: A)
    是静态编译时决定的