【发布时间】:2012-04-03 03:42:42
【问题描述】:
我很想知道 C++ 中是否有接口,因为在 Java 中,设计模式的实现主要是通过接口解耦类。那么有没有类似的方法在 C++ 中创建接口?
【问题讨论】:
-
你真的需要接口吗?
C++对模板有广泛的支持。只需编写接收模板的函数,并确保传递的类型具有不会导致编译错误的 require 方法,因此您不会强迫用户从任何东西继承来使用您的方法。
我很想知道 C++ 中是否有接口,因为在 Java 中,设计模式的实现主要是通过接口解耦类。那么有没有类似的方法在 C++ 中创建接口?
【问题讨论】:
C++ 对模板有广泛的支持。只需编写接收模板的函数,并确保传递的类型具有不会导致编译错误的 require 方法,因此您不会强迫用户从任何东西继承来使用您的方法。
C++ 没有内置的接口概念。您可以使用仅包含pure virtual functions 的abstract classes 来实现它。由于它允许多重继承,你可以继承这个类来创建另一个类,然后在其中包含这个接口(我的意思是对象接口:))。
一个例子是这样的 -
class Interface
{
public:
Interface(){}
virtual ~Interface(){}
virtual void method1() = 0; // "= 0" part makes this method pure virtual, and
// also makes this class abstract.
virtual void method2() = 0;
};
class Concrete : public Interface
{
private:
int myMember;
public:
Concrete(){}
~Concrete(){}
void method1();
void method2();
};
// Provide implementation for the first method
void Concrete::method1()
{
// Your implementation
}
// Provide implementation for the second method
void Concrete::method2()
{
// Your implementation
}
int main(void)
{
Interface *f = new Concrete();
f->method1();
f->method2();
delete f;
return 0;
}
【讨论】:
interface.
“接口”相当于 C++ 中的纯抽象类。理想情况下,这个接口class应该只包含纯virtualpublic方法和static const数据成员。例如:
struct MyInterface
{
static const int X = 10;
virtual void Foo() = 0;
virtual int Get() const = 0;
virtual inline ~MyInterface() = 0;
};
MyInterface::~MyInterface () {}
【讨论】:
virtual 只是为了维护类的纯abstractness 和inline,以便它可以驻留在头文件中而不会出现链接器错误。
virtual ~interfaceA() {}。您的类已经是抽象的,因此您不会通过将析构函数设为纯虚函数来获得任何收益。
C++中没有接口的概念,
您可以使用 Abstract class 模拟该行为。
抽象类是具有至少一个纯虚函数的类,一个不能创建抽象类的任何实例,但您可以创建指向它的指针和引用。此外,从抽象类继承的每个类都必须实现纯虚函数才能创建它的实例。
【讨论】:
interface