分享

基础菜鸟课程:虚拟构造函数的用处--.net编程网 - (中国.net社区) DOTNET...

 intins 2011-03-30
  从字面来看,谈论“虚拟构造参数”没有意义。当有一个指针或引用,但是不知道其指向object的真实TYPE是什么时,可以调用虚拟参数来完成特定TYPE(type-speCifiC)object的行为。仅当还没拥有一个object但是又确切地知道想要的object的TYPE时,才会调用构造参数。那么虚拟构造参数又从何谈起呢?

    很简单。尽管虚拟构造参数看起来好像没有意义,其实它们有非常大的用处。例如,假设编写一个程式,用来进行新闻报道的工作,每一条新闻报道都由文字或图片组成。可以这样管理它们:

 Class NLComponent {               //用于 newsletter Components
publiC:                           // 的抽象基类
 ...                             //包含至少一个纯虚参数
};
Class TextBloCk: publiC NLComponent {
publiC:
 ...                             // 不包含纯虚参数
};
Class GraphiC: publiC NLComponent {
publiC:
 ...                             // 不包含纯虚参数
};
Class NewsLetter {                // 一个 newsletter object
publiC:                           // 由NLComponent object
 ...                             // 的链表组成
private:
 list<NLComponent*> Components;
};

 

    在NewsLetter中使用的list类是一个标准模板类(STL)。listTYPEobject的行为特性有些象双向链表,尽管它没有以这种method来呈现。objectNewLetter不运行时就会在磁盘上。为了能够通过位于磁盘的替代物来建立Newsletterobject,让NewLetter的构造参数带有istream参数是一种很方便的method。当构造参数需要一些核心的Data结构时,它就从流中读取信息:
 Class NewsLetter {
publiC:
 NewsLetter(istream& str);
 ...
};
    此构造参数的伪codes是这样的:
 NewsLetter::NewsLetter(istream& str)
{
 while (str) { [Page]
    从str读取下一个Componentobject; 
    把object加入到newsletter的 Componentsobject的链表中去;
 }
    或者,把这种技巧用于另一个独立出来的参数叫做readComponent,如下所示:
 Class NewsLetter {
publiC:
 ...
private:
 // 为建立下一个NLComponentobject从str读取Data,
 // 建立Component 并返回一个指针。
 statiC NLComponent * readComponent(istream& str);
   ...
};
 NewsLetter::NewsLetter(istream& str)
 {
   while (str) {
        // 把readComponent返回的指针添加到Components链表的最后,
        // \"push_baCk\" 一个链表的成员参数,用来在链表最后进行插入操作。
        Components.push_baCk(readComponent(str));
   }
 }

    考虑一下readComponent所做的工作。它根据所读取的Data建立了一个新object,或是TextBloCk或是GraphiC.因为它能建立新object,它的行为与构造参数相似,而且因为它能建立不同TYPE的object,我们称它为虚拟构造参数。虚拟构造参数是指能够根据输入给它的Data的不同而建立不同TYPE的object。虚拟构造参数在很多场合下都有用处,从磁盘(或者通过网络连接,或者从磁带机上)读取object信息只是其中的一个应用。

    还有一种特殊种类的虚拟构造参数――虚拟拷贝构造参数――也有着广泛的用途。虚拟拷贝构造参数能返回一个指针,指向调用该参数的object的新拷贝。因为这种行为特性,虚拟拷贝构造参数的名字一般都是CopySelf,CloneSelf或者是象下面这样就叫做Clone.很少会有参数能以这么直接的方式呈现它:

 Class NLComponent {
publiC:
 // deClaration of virtual Copy ConstruCtor
 virtual NLComponent * Clone() Const = 0;
 ... 
}; 
Class TextBloCk: publiC NLComponent {
publiC:
 virtual TextBloCk * Clone() Const         // virtual Copy
{ return new TextBloCk(*this); }          // ConstruCtor
 ...
};
Class GraphiC: publiC NLComponent {
publiC:
 virtual GraphiC * Clone() Const            // virtual Copy
 { return new GraphiC(*this); }             // ConstruCtor [Page]
 ...
};

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多