关于TStrings和TStringList的关系和区别(50分)

E

ego

Unregistered / Unconfirmed
GUEST, unregistred user!
用了很久的TStrings类型,也知道TStrings是一个抽象类,所以如果想使用TStrings类型,
必须用它的子类TStringList。但是我今天偶然发现,其实直接用TStringList也可以完成
TStrings的功能。也就是说
var
s: TStrings
begin
s:=TStringList.create;
s.add('ok');
......
end;
上面的代码与下面的代码的功能是一样的:
var
s:TStringList;
begin
s:=TStringList.create;
s.add('ok');
......
end;
那为什么还要用TStrings?干么不直接用TStrinList?
why?
 
[:D][:D]
看来你面向对象的思想好不熟,一般用第二种写法
TStrings存在有它的理由
 
>>看来你面向对象的思想好不熟,一般用第二种写法
惭愧!我对面向对象的思想的确不熟,处于稀里糊涂之类的地步。还请高手多多指教。

>>TStrings存在有它的理由
什么理由呢?能详细说说吗?
 
谁知道啊?
 
我也不太清楚,只是认为Borland也许想从TStrings派生出多个类,并不只TStringList
 
实际上TStrings派生出了2个子类:TStingList和TStringGridStrings
 
那直接用TStringList不就可以了,为什么还用TStringS ?
 
TStringList的功能TStringGridStrings并不全部需要,你要让TStringGridStrings继承自
TStringList岂不浪费?所以他俩是一个娘生的,各有所长
 
呵呵,很形象:)
 
正如所有类都继承于TOBJECT,同样的道理只是继承而已。
如果按你所说,那么TOBJECT也不用直接用子类就好了,
那还有类的封装,继承和多态吗?!
 
抽象类自有其抽象类的道理

这是一种体会的东西

你用多了也就有体会了
 
老实说,你们不说我还明白一点,你们越说我越糊涂了 :(

昨晚我浏览了一下TStrings类和TStringList类。我发现虽然TStringList的大多数函数方法是继承自TStrings,
用的是覆盖的方式,但其实这些override的函数大多数都没有继承TStrings的虚方法的代码。
这样的话,TStringList继承自TStrings还有什么意义?
因为这样不但享受不到基类的好处,反而因为继承了基类的代码而导致文件变大。
why ?

 
两者的差别好象不是太大,不过好多控件的ITEM属性都用的是Tstrings类型,
Borland这么做应该有它的道理。
 
Borland就喜欢用数组容器,所以TStrings常常会用到。正因为如此,所以今天非得把TStrings搞懂不可!
 
TStringList是由TStrings继承来的, TStrings中有好多功能没有实现,所以尽量不要用
TStrings来声名,在第一种写法中实际还是TStringList
 
在Object Pascal语言中,类变量相当于一个指针.父类变量可以指向子类实例,但只能调用在
父类中声明的属性和方法.如果采用第一种方法,就无法调用TStringList的Find和Sort方法.
TStrings是一个抽象类.在抽象类中,有一种抽象方法.它的实现并没有出现在定义它的类说
明中,而是放在子类中具体说明,如TStrings的Delete和Clear方法.这种方法事实上只定义
了一个接口.一个方法在被说明为virtual或dynamic之后加上abstract后,就成为一个抽象
方法.
抽象类的存在可以实现面向对象编程的一个特征:多态性.即多个子类继承自一个父类,用一
个父类变量可以访问多个子类的实例,并调用不同的方法.例如:
var
s1:TStrings;
s2:TStringList;
s3:TStringGridStrings;
begin
s1:=TStringList.Create;
s1.add
//此时调用的是TStringList中的方法.
s1.Destory;
s1:=TStringGridStrings.Create;
s1.Add
//此时调用的是TStringGridStrings中的方法
s1.Destory;
end;



 
非常明白,谢谢!
 
明白了。
ps: lop不好意思,分不够了。
 
顶部