C 箴言:理解隐式接口和编译期多态

2008-02-23 05:27:11来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

object-oriented programming(面向对象编程)的世界是围绕着 explicit interfaces(显式接口)和 runtime polymorphism(执行期多态)为中央的。例如,给出下面这个(没有什么意义的)的 class(类)。

class Widget {
 public:
  Widget();
  virtual ~Widget();
  virtual std::size_t size() const;
  virtual void normalize();
  void swap(Widget& other); // see Item 25

  ...
};

  连同这个(同样没有什么意义)的 function(函数),

void doProcessing(Widget& w)
{
 if (w.size() > 10 && w != someNastyWidget) {
  Widget temp(w);
  temp.normalize();
  temp.swap(w);
 }
}

  我们能够这样谈论 doProcessing 中的 w:

  ·因为 w 被声明为 Widget 类型的引用,w 必须支持 Widget interface(接口)。我们能够在源代码中找到这个 interface(接口)(例如,Widget 的 .h 文档)以看清楚他是什么样子的,所以我们称其为一个 explicit interface(显式接口)——他在源代码中显式可见。

  ·因为 Widget 的一些 member functions(成员函数)是虚拟的,w 对这些函数的调用就表现为 runtime polymorphism(执行期多态):被调用的特定函数在执行期基于 w 的 dynamic type(动态类型)来确定(参见《C 箴言:绝不重定义继承的非虚拟函数》)。

  templates(模板)和 generic programming(泛型编程)的世界是根本不同的。在那个世界,explicit interfaces(显式接口)和 runtime polymorphism(执行期多态)继续存在,但是他们不那么重要了。作为替代,把 implicit interfaces(隐式接口)和 compile-time polymorphism(编译期多态)推到了前面。为了了解这是怎样一种情况,看一下当我们把 doProcessing 从一个 function(函数)转为一个 function template(函数模板)时会发生什么:

template<typename T>
void doProcessing(T& w)
{
 if (w.size() > 10 && w != someNastyWidget) {
  T temp(w);
  temp.normalize();
  temp.swap(w);
 }
}

  现在我们能够如何谈论 doProcessing 中的 w 呢?

  ·w 必须支持的 interface(接口)是通过 template(模板)中在 w 身上所执行的操作确定的。在本例中,他显现为 w 的 type (T) 必须支持 size,normalize 和 swap member functions(成员函数);copy construction(拷贝构造函数)(用于创建 temp);连同对不等于的比较(用于和 someNastyWidget 之间的比较)。我们将在以后看到这并不很精确,但是对于现在来说他已足够正确了。重要的是这一系列必须有效地适合于模板编译的表达式是 T 必须支持的 implicit interface(隐式接口)。

  ·对诸如 operator> 和 operator!= 这样的包含 w 的函数的调用可能伴随 instantiating templates(实例化模板)以使这些调用成功。这样的 instantiation(实例化)发生在编译期间。因为用不同的 template parameters(模板参数)实例化 function templates(函数模板)导致不同的函数被调用,因此以 compile-time polymorphism(编译期多态)著称。

  即使您从没有使用过模板,您也应该熟悉 runtime(运行期)和 compile-time polymorphism(编译期多态)之间的区别,因为他类似于确定一系列重载函数中哪一个应该被调用的过程(这个发生在编译期)和 virtual function(虚拟函数)调用的 dynamic binding(动态绑定)(这个发生在运行期)之间的区别。explicit(显式)和 implicit interfaces(隐式接口)之间的区别是和 template(模板)有关的新内容,需要对他进行近距离的考察。

  一个 explicit interface(显式接口)由 function signatures(函数识别特征)组成,也就是说,函数名,参数类型,返回值,等等。例如,Widget class(类)的 public interface(显式接口),

class Widget {
public:
Widget();
virtual ~Widget();
virtual std::size_t size() const;
virtual void normalize();
void swap(Widget& other);
};


[1] [2] 下一页

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C 程式设计从零开始之语句

下一篇: C 对象布局及多态之虚成员函数调用

热门词条
热门标签