接口,通俗的来说就是定义了一组要实现的功能,这些功能被表现为一组函数,
这些函数在语义上给定接口实现类的责任。
C++中常用的定义接口的方法是纯虚类。但是定义的函数却是要确定操作类型的
但是从接口在语义上的考虑,其实是不需要的。
用模板技术来改变。
定义一个接口类,在类中只定义接口函数,这些函数是Client要使用的,这个
类是一个模板类,如下
template< typename T >
class Interface
{
public:
template< typename T1 >
void Fun( const T &t );
......
};
这种方式解决了接口函数被类型限制。
模板类的参数是一个继承类,这个继承类完成实际的操作。实体类的定义如下
class C : public Interface< C >
{
......
};
子类去一个个的实例话其实很不好,也不符合一般C++的编程方法。由于在模板
编程的情况下,更注重的是语义的符合,所以可以在子类中使用重载的方法去实现对
不同类型的实际处理(毕竟没有类的编写者知道自己这个类要处理的类型)。那么可
以载接口类中写些代码,来调用子类的函数,这种调用实际上在语义上定义了子类要
实现的责任。上面的接口的定义变成下面这个样子
template< typename T >
class Interface
{
public:
T* This( void ) { return static_cast< T* >( this ); }
template< typename T1 >
void Fun( const T &t )
{
this->This()->Ope( t );
}
......
};
这样,子类只用实现对不同类型的处理的Ope函数了,对外的公共接口还是一样的。
显现中要讲基类编程子类的友员,Ope定义在protected或private作用域中。
posted on 2007-01-13 18:06
walkspeed 阅读(2284)
评论(0) 编辑 收藏 引用