想必大家都用过Tquery控件吧,有个写法大家也一定很熟悉
query1.close;
query1.sql.clear;
query.sql.add('...');
query.open;
我想问的是:
第二行的sql为TStrings类型,它的clear过程在TStrings类中定义为virtual abstract,既然有这样的关键字修饰,就不该直接调用的啊,因为这个过程在TStrings类中并没有函数体,不知道query1.sql.clear这样调用TStrings类中的纯虚方法clear时编译器却不报错的原因在那里,望大家发表一下自己的看法,交流才能进步,希望大家一同进步!!!

解决方案 »

  1.   

    第二行的sql为TStrings类型呵呵,但其实这个属性创建时候是这样用TStringList类创建的,所以当然可以了。
    像其他的控件也有很多有这相属性,比如Memo,ComboBox,他们的Lines,Items
    都是TStrings类型的,但他们创建的时候是用TStringList类来创建的,TStringList类是TStrings的子类,覆盖了Clear方法,所以就可以用了。这就是多态啦。
    你看看源码。
      

  2.   

    TO : linzhengqun(风) 先谢谢你的解释,但还有个疑问:delphi是如何知道要调用TStringList类中的Clear方法呢?我的想法是这样的:既然SQL的类型是TStrings,那么就该调用TStrings类中方法,如何能调用了其子类的TStringList中的Clear方法呢?望指教啊!!!“呵呵,但其实这个属性创建时候是这样用TStringList类创建的”如何知道是利用TStringList类来创建的呢?
      

  3.   

    这个就是多态的问题了,两句话真的不知道怎么和你解释》》如何知道是利用TStringList类来创建的呢?
    你看一下源码不就知道了吗,再说,如果不用TStringList,那调用的时候会出错的。而正是因为属性创建的时候是用TStringList,所以当属性被调用,调用属性中的方法时
    实际调用的就是TStringList类中的方法了。你看看面向对象的书吧,这样就能明白了。