s:TStream 和s:TMemoryStream的分别.(39分)

  • 主题发起人 主题发起人 wrl_001
  • 开始时间 开始时间
W

wrl_001

Unregistered / Unconfirmed
GUEST, unregistred user!
s:TStream;
s:=TMemoryStream.create

s:TMemoryStream;
s:=TMemoryStream.create
两个写法,前面一个有什么好处吗?举个详细点的例子.^_^

----------问题来由-----------
初学java,在一个论坛中回答了这样一个问题:
class A{}
class B extends A{}
写成A a=new B()
比 B a=new B()有什么好处?
>>>当时不知道怎么回事居然回答:
比如一个函数是;
void dothing(A a){}
在这个时候如果写成B a=new B()就无法直接传入了,
但如果写成A a=new B()就可以了
----狂汗..
写过的代码一般在下面的情况下才会这么写....
var
ds:TDataSet;
begin
if iType=1 ds:=ADOQuery
else ds:=ClientDataSet;
....
end;
 
这个是向下转型的一种创建方式
你可以参考一下刘艺老师的书 具体的记不起来了
 
总有人搬出某人来说事,象楼上的那位,搬都搬不明白,而这个某人在某些帖子里大呼自己
是大师,还弄了帮喽罗一起山呼万岁,很搞笑的。

我真心地希望楼主还不知道这个情况。

你说的这种定义方法,是为了赢得在调用中更广泛的通用,但同时也失去了具体类的某些
特性。比如,TMemoryStream 相对于其他 TStream 的特点是具有指针操作,可以快速运动
到 Stream 数据的任何地方,其他 Stream 没有这个特性,但又有了它其他的特性。假如
为了方便调用,把本应该最好用 TMemoryStream 的定义改成 TStream,那么正常情况下,
你就应该避免在这个程序段里再使用强制转换和进行指针操作,而使用 TStream 提供的通
用操作来完成。否则你就是一个伪定义,就像某人是个伪大师一样!
 
我这里说的是某大师不会说的,因为他除非看了我这个帖子,否则他根本不知道有这个讲
究,虽然他在我的某个帖子的言论后面承认了伪大师的身份,但言辞之下好像悻悻然很不
服气的样子。现在我们大可不必管他,也省得他没事就为自己的几篇从国外论坛抄来的文
章不断写勘误。

如我上面说的,假如我即定义 TStream 而我确确实实要在代码中使用 TMemoryStream 这
样的操作怎么办?没办法,你要么修改参数定义,要么你在段落里重建一个 TMemoryStre
am 来做转换,这如同做人的道理是一样的,里外要一致。当然,假如你已经是一个高手了
的话,还是有办法做到即不重新创建、也不强制转换、也不改变定义而使用指针的。
 
flamingo 你脑袋是不是让门挤了啊
我只是读过你不懈的那位大师的几本书 你就不至于说我是他的喽罗吧
我看过李维的很多书 是不是说我就是李维的走狗啊?

我不过是让楼主看看某本书书的上的说法,你不至于这个样子吧
你和刘艺有仇就只说吗 不要某大师的 某大师的 烦不烦啊

少把文革一套拿到现在来 神经病
 
粗略看一下.
觉得楼主: 说的就是一个通用的参数传递方式! 在d里面你可以把任何对象都定义为Tobject来使用. 这样你可以传递任何对象类型过去, 但是是那个类要判断清楚,否则发生不可预测的错误.
TO flamingo
其实你说的也有道理, 但象楼主所说的就是要判断类型的前提下, 我认为也不会有什么问题吧. 题目是拿来讨论的. 我也是菜鸟.
 
其实就是设计模式中的“依赖倒置”原则啊,至于好处,任何一本讲解模式的书上都有。
 
kk2000,你的说法我想你还需要仔细再回顾一遍我说的全部内容,有好处。

Avalon,要想回答问题,需要用你自己的理解、自己的认识去回答,即便错了也没关系,不
懂的东西多了去了,回答错了也很正常。但切忌套狗语,不需要每个帖子都混进去捣鼓捣鼓
,这里的分不能拿来当饭吃,你能回答就回答,不能回答就不回答,真需要拿一番狗语来搪
塞,最起码也要汪汪得象个样,你的帖子是你发的,你自己看看这是在回答问题还是在学狗
语。
 
flamingo,你说的如何证明是对的??
 
我知道这种定义的意思和其中的含义,只是无法用很明白的文字表达或用比较通俗易懂的例子解释,不过LSUPER已经说的很清楚了[:D]
多谢各位。
 
to flamingo, 我说什么你这条狗是不会明白的 也明白不了
没办法 你这条狗智商就是这个样子

我回答错了 楼主可以自己甄别 人家不是3岁孩子分辨不了是非
是不是不一定非用你来乱吠证明的吧
我就不明白 你为什么把我和刘艺放在一起 还是什么喽罗
那你又是什么? 我知道你是那种天生就是天才的狗,这个可是你自己说的
感叹
真是林子打了什么狗都有
和你这种长着一张狗嘴 却老想吐出象牙的狗屎
真是没什么好说的 这年头像你这样的狗比人还横啊 也是新鲜了

你个白痴自己看看你自己回帖 你这人除了骂人和狗吠还有什么?
 
楼主 我没有误导你的意思
很抱歉我不应该占着你帖子 你说的那个问题 其实也是我一个不是很明白的问题
但LSUPER,说的依赖倒置原则应该符合你要求
这2天给你造成不舒服 希望你原谅

这里有大富翁的一个笔记 说的比较清楚
http://www.delphibbs.com/keylife/iblog_show.asp?xid=12468

我自己的实践中 用到这个还是TStream类
主要根据实际需要派生创建
TFileStream (for working with files)
TStringStream (for manipulating in-memory strings)
TMemoryStream (for working with a memory buffer)
TBlobStream (for working with BLOB fields)
TWinSocketStream (for reading and writing over a socket connection)
TOleStream (for using a COM interface to read and write)

就像 那个大师说的 是为了赢得在调用中更广泛的通用
至于是原则和为什么 恕我愚昧 我其实不是很明白
不关如何 通过你这个帖子还是不少新的知识和认识的盲区 呵呵
 
想不到我的帖子会沦为战场^_^
Avalon多谢你的回答.
 
to wrl_001
其实我真的不想和谁吵的
不好意思占用你的帖子 呵呵
 
后退
顶部