Alan Colburn wrote:
> Well, a day later I realized that I can address the issues I'm talking 
> about below by simply having one class for the collection (TPeople), and 
> have classes with SaveToFile and LoadFromFile methods that derive from 
> TPeople. Each derived class could use different ways to persist data ... 

Notice how a lot of classes in the VCL have two kinds of saving methods. 
One is called SaveToFile, and the other is SaveToStream. The latter is 
much more flexible, and once you have it, the former is trivial to write 
and doesn't need to be duplicated in any of the descendant classes.

SaveToStream receives a TStream reference as a parameter. The receiver 
then calls methods on the stream to save itself there.

SaveToFile is now just a special application of SaveToStream:

procedure TPeople.SaveToFile(const Name: TFileName);
var
   fs: TFileStream;
begin
   fs := TFileStream.Create(Name, ofCreate);
   try
     SaveToStream(fs);
   finally
     fs.Free;
   end;
end;

SaveToStream can be virtual so descendants can override it and provide 
specialized streaming ability. SaveToFile does not need to be virtual 
because the implementation above should be sufficient for all descendants.

SaveToStream is great because right away, your class knows how to save 
itself not only to files, but also to memory buffers, compression 
algorithms, network connections, registry keys, and anything a TStream 
descendant is available for.

LoadFromFile and LoadFromStream work the same way.

-- 
Rob
_______________________________________________
Delphi mailing list -> Delphi@elists.org
http://www.elists.org/mailman/listinfo/delphi

Reply via email to