Template Tethod 模式
xlsue 2006-01-03 02:30:48 class Base
{
private:
// … 一些数据,与本主题无关 …
virtual std::string classID() const { return "Base"; }
protected:
// 当派生类装入自身后,应该调用该函数的父类实现。
virtual void do_read( std::istream& );
// 当派生类保存完自身后,应该调用该函数的父类实现。
virtual void do_write( std::ostream& ) const;
public:
// … 需要实现的一些虚拟函数,与本主题无关…
// Streaming functions.
void read( std::istream& );
void write( std::ostream& ) const;
virtual ~Base();
};
// 流处理过程中的几个帮助函数。注意它们并非友元!
std::ostream& operator <<
( std::ostream& o, const Base& b) { b.write(o); }
std::istream& operator >>
( std::istream& o, Base& b) { b.read(o); }
void Base::write( std::ostream& o ) const
{
o << classID() << std::endl;
do_write(o);
}
std::auto_ptr<Base> loadBase( std::istream& inFile )
{
std::string className;
std::getline( inFile, className );
std::auto_ptr<Base> newBase =genericFactory<Base>::instance().create(className);
if( newBase.get() != 0 ) {
inFile >> *newBase;
}
return newBase;
}
void Base::read( std::istream& i )
{
do_read(i);
}