想必大家都用过Tquery控件吧,有个写法大家也一定很熟悉
query1.close;
query1.sql.clear;
query.sql.add('...');
query.open;
我想问的是:
第二行的sql为TStrings类型,它的clear过程在TStrings类中定义为virtual abstract,既然有这样的关键字修饰,就不该直接调用的啊,因为这个过程在TStrings类中并没有函数体,不知道query1.sql.clear这样调用TStrings类中的纯虚方法clear时编译器却不报错的原因在那里,望大家发表一下自己的看法,交流才能进步,希望大家一同进步!!!
query1.close;
query1.sql.clear;
query.sql.add('...');
query.open;
我想问的是:
第二行的sql为TStrings类型,它的clear过程在TStrings类中定义为virtual abstract,既然有这样的关键字修饰,就不该直接调用的啊,因为这个过程在TStrings类中并没有函数体,不知道query1.sql.clear这样调用TStrings类中的纯虚方法clear时编译器却不报错的原因在那里,望大家发表一下自己的看法,交流才能进步,希望大家一同进步!!!
像其他的控件也有很多有这相属性,比如Memo,ComboBox,他们的Lines,Items
都是TStrings类型的,但他们创建的时候是用TStringList类来创建的,TStringList类是TStrings的子类,覆盖了Clear方法,所以就可以用了。这就是多态啦。
你看看源码。
你看一下源码不就知道了吗,再说,如果不用TStringList,那调用的时候会出错的。而正是因为属性创建的时候是用TStringList,所以当属性被调用,调用属性中的方法时
实际调用的就是TStringList类中的方法了。你看看面向对象的书吧,这样就能明白了。