所有的类都是从TObject中继承的,TObject类中的方法也应当被所有的子类所约继承,但为何在TComponent的子类中无没有带有参数的create方法?而只有带有参数的Create(...)的方法?

解决方案 »

  1.   

    create的参数是可以设置为NIL的,如果这样,父类析构的时候对象是不会自动释放,所以一般create方法的参数为父类对象,由于object是基类所以没有父类对象
      

  2.   

    这我明白,我不明白的是,为何从TComponet继承下的类都没有无参数的Create方法?
    如:
    TTest=class(TComponent)
    end;var
      a:TTest;
    begin
      a:=TTest.create;//这句报错。
      ...
    end;而按继承的概念来讲,父类除私有private限制的字段及方法,属性子类不能继承,其他的如public,protected,published段中的属性,字段,方法都可以被子类所继承,也就是可以使用。TObject中的这些方法都应该是子类可以继承的呀。
      

  3.   

    constructor Create(AOwner: TComponent); virtual;
    TComponet的构造器被重新定义了,所以不能再使用TOBJECT的CREATE了,必须传递一个TComponet参数,当然这个参数可以使用NIL。
      

  4.   

    面像对像不仅有继承,还有覆盖了类可以继承父类的方法,也可以隐藏父类的方法(通过取与父类相同方法的函数名)
    TObject.Create是个静态方法,TComponent 重写了 Create 函数,并且没有重载,所以没带参数的Create方法被这个方法隐藏了。
      

  5.   

    to stealDream:那是不是能在TComponent的create(..)方法中用inherited create调用TObject的Create方法呢?
      

  6.   

    是的,不过没有必要,因为VCL对每个类的Create是一样对待的。
    假设你的Ttest类从TObject继承下来,且没有写自己的构造函数,则TTest.create时它调用的是Tobject的Create,如果TTest类有写构造函数Create,则TTest.Create时它调用自己的构造函数,这时它是不会去调用TObject的构造函数的,因为没有必要,TTest自己的构造函数就会执行分配对象内存等操作。
    而TComponent的Create(...)也是一样的,只不过它要作一些组件特性的操作,所以要设为虚方法,让子类继承时覆盖它,并Inherited它。