码迷,mamicode.com
首页 > 编程语言 > 详细

C++里的接口(Interface)

时间:2016-03-19 00:50:42      阅读:815      评论:0      收藏:0      [点我收藏+]

标签:

C++是允许多重继承的,而这个设计既会引起问题又不是很常用,于是java和C#都采用了另一种方式:接口(Interface)。类继承(实现)接口并不表明 is-a关系,而是“有某种功能”、“符合某种性质”的关系。C++虽然语法上不支持接口,但是这个思路还是可以拿来用的嘛。比如设计这样一个接口:

struct hashable
{
    virtual size_t hash_code() = 0;
};

然后让一个类继承它,并实现函数,就代表了该类是可哈希的。

事情没这么简单,在C++里,接口还可以有很多魔性的用法,尤其是遇上泛型的时候。有时候,当你继承接口并实现一个函数的时候,它会自动帮你实现其它功能;有时候,当你继承的时候,一切都完成了。看一下下面这个例子(出自boost::operators):

template<class T>
struct less_than_comparable
{
    friend bool operator> (const &T x, const &T y) {return !(x<y || x==y);}
    friend bool operator<= (const &T x, const &T y) {return x<y || x==y;}
    friend bool operator>= (const &T x, const &T y) {return !(x<y);}
};

它用起来稍微有些奇怪,继承的时候需要用子类作父类的模板参数,比如:

class my_class : public less_than_comparable<my_class>
{
    //实现friend operator< 与operator==
};

与java或C#里的情况不同,接口里定义的函数与在子类里实现的函数并不相同,接口里的函数是扩展实现函数的功能。这样,程序员只要实现<与==,就自动获得了>、<=与>=的实现。

如果像这样的泛型接口里的函数既与类型无关,又不依赖别的函数,就可以达到“继承即实现”的效果了,一个例子是boost::serialization::singleton,这个在网上有关单件模式的实现的文章里可以看到。

 

C++里的接口(Interface)

标签:

原文地址:http://www.cnblogs.com/lzxskjo/p/5294126.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!