在开发COM+的时候,我定义了两个接口:IParent, IChild如下:  IParent = interface(IDispatch)
    procedure Method1; safecall;
  end;
  
  IChild = interface(IParent)
    procedure Method2; safecall;
  end;
    
其中IChild是由TChildObject类实现,并有对应的CoClass.  TParentObject = class(TMtsAutoObject, IParent)
  protected
    procedure Method1; safecall;
  end;  TChildObject = class(TParentObject, IChild)
  protected
    procedure Method2; safecall;
  end;
  
  在类型库编辑器里,为IChild增加一个Method3,
  在Delphi5里,刷新后记得是这样的:
  
  TChildObject = class(TParentObject, IChild)
  protected
    procedure Method2; safecall;
    procedure Method3; safecall;
  end;
  
  在Delphi6里,又把Method1加了一遍,成了:
  TChildObject = class(TParentObject, IChild)
  protected
    procedure Method1; safecall;
    procedure Method2; safecall;
    procedure Method3; safecall;
  end;  由于我的COM对象好多个,其中很多可以有共同的特性,所以用
一个相应的父类来实现那些共同的特性方法,可每次增加一个新方法或属性,
刷新后就把所有接口方法又加一次,虽然可以手工删除掉就可以了,
可还是很麻烦,因为组件太多了有什么好办法?有什么设置?搞不懂,为什么Delphi5可以,Delphi6,7又不可以了……

解决方案 »

  1.   

    你的表述好像不是很清楚,Delphi5里面可以怎么样?Delphi6、7不可以的又是什么东西?
      

  2.   

    我的意思是:
    在Delphi5里可以自动判断一个接口方法是否由父类实现了
    如果已经有父类实现了这个方法,那么在刷新时就不再在
    子类里加了,就象上面我说的Method1。而在Delphi6,7里不管3721,把接口应该具备的所有方法都加在了
    子类里。
      

  3.   

    噢,看明白了:)
    那在接口实现的单元里如果不写Child从Parent继承的Method1的实现代码,编译会出错吗?
      

  4.   

    只要Parent类实现了Method1,Child类可以不实现Method1如果在Child的Method1不写实现代码,那么调用Method1的时候不就什么都不干了吗?
      

  5.   

    正如你所说的:只要Parent类实现了Method1,Child类可以不实现Method1。
    因为Child会自动从Parent继承方法和属性,所以实际上Child调用Method1的时候,也会自动从Parent调用实现代码(而不是什么都不干)。当然,如果你如果重载(Override)了Method1,程序才会执行你的重载代码。
    所以我觉得你只要不需要重载那些方法而编译又没有报错的话,你可以不管那些自动生成的东西。
      

  6.   

    嗯,我是觉得你说的是不对的
    因为自动生成后,虽然我们可以不写实现代码,但是不写实现代码的“空实现”也是
    实现,我觉得在调用时应该还是调用的是“空实现”的实现,就是什么都不干。
    而且我已经试过了 :)不过我的这个问题已经知道怎么解决了,就是一个选项:
    在Tools -> Environment Options -> Type Library页里的下面有选项:
    Display updates before refreshing
    这样在刷新时可以自己选择刷新还是不刷新,就解决了,虽然每次新加方法都要选一次
    不过我觉得这种方式应该比Delphi5的方式还是要好一些。最后, hthunter(核桃) ,我还是非常感谢你
      

  7.   

    TO: hthunter(核桃) 很感谢你的回复
    说实话
    我每次在CSDN提的问题基本上很少有人来参与
    你是我遇到的最热心的一个,哈哈
    所以我把分都给你 :)嗯,我的分很多,都不知道怎么弄出去,10000多分,我可没有那么多问题啊
      

  8.   

    同感同感,我也有将近8000分不知道怎么用,sigh