c++接口的好处
benefits of interface c++?
看看这段代码
#include<iostream>
using namespace std;
//Shape is an Interface Class. No data and everything pure virtual
class Shape {
public:
virtual void Area(int length, int breadth) = 0;
virtual void Perimeter(int length, int breadth) = 0;
//Note, no data
};
//Derived class - Inherits Shape as Public
class Rectangle : public Shape {
public:
void Area(int length, int breadth);
void Perimeter(int length, int breadth);
private:
int someData;
};
//Derived class - Inherits Shape as Public
class Triangle : public Shape {
public:
void Area(int length, int breadth);
void Perimeter(int length, int breadth);
private:
int someData;
};
int main()
{
Rectangle r;
Triangle t;
cout<<"nn";
r.Area(3,4);
r.Perimeter(3,4);
t.Area(3,4);
t.Perimeter(3,4);
cout<<"nn";
return 0;
}
void Rectangle::Area(int length, int breadth)
{
cout<<"nThe Area of Rectangle for length = "<<length<<" and
breadth = "<<breadth<<" is "<<(length * breadth)<<endl;
}
void Rectangle::Perimeter(int length, int breadth)
{
cout<<"nThe Perimeter of Rectangle for length = "<<length<<" and
breadth = "<<breadth<<" is "<<2 * (length + breadth)<<endl;
}
void Triangle::Area(int length, int breadth)
{
cout<<"nThe Area of Triangle for length = "<<length<<" and
breadth = "<<breadth<<" is "<<(length * breadth)/2<<endl;
}
void Triangle::Perimeter(int length, int breadth)
{
cout<<"nThe Perimeter of Triangle for length = "<<length<<" and
breadth = "<<breadth<<" is "<<(length * breadth)/3<<endl;
}
我在代码中使用接口,但我的问题是我应该使用它,它的好处是什么,没有性能,没有真正需要它,为什么我应该使用它(接口)。使用它的意义是什么,请你解释一下。
抽象接口将接口与实现分开。就像青春痘成语it
- 减少编译时间,
- 允许在不破坏ABI的情况下更改实现。
接口可以用来拥有,比如说,不同Shape对象的向量。否则你就不能有一个混合三角形和矩形的集合。或者另一个类可以有一个Shape成员,它可以是三角形或矩形。这些只是一些例子。
编辑:让我举一个具体的例子。假设您有一个名为Car的接口。假设你想要有一个类Garage,它有一个单独的Car的空间。您已经实现了不同类型的汽车,它们都使用Car接口。那么Garage类可以是这样的:
class Garage {
public:
Car getCar(); // returns _theCar
private:
Car _theCar:
}
在编程c++(和其他面向对象语言)时,一个常见的错误是过多地使用继承。接口是正确的继承。原因是接口的强大之处在于能够处理另一个系统中不同类型的对象,就好像它们是相同类型一样。例如,三角形和圆形都可以是形状,并且可以传递给图形引擎以便在屏幕上绘图。
接口比包含继承功能的继承"更好"的原因是,它很快就变得非常难以理解类的真正功能,难以调试它并验证对象的内部状态不能通过使用外部方法来破坏。
在一个小的例子中,对这种类型的结构的需求很难激发,但是当项目变大时,这种需求就变得很明显了。除了使我上面描述的事情成为可能之外,它们也很好地使测试程序变得更容易,因为你可以用存根实现替换程序的一部分(比如数据库访问),这样你就可以编写自动测试来验证程序的其他部分(比如处理数据)
选择接口而不是直接访问成员没有性能方面的原因,相反,因为您将调用虚方法。然而,在大多数情况下,这是一个非常小的性能损失。
在这里查看更多关于c++ MI的信息-为什么我应该避免c++中的多重继承?
在"3个接口"部分和ybungalobill的回答的基础上,考虑典型的观察者模式:
class MyClass : public IScreenListener
{
public:
MyClass()
{
PowerManager::RegisterScreenListener(*this);
}
// Overriding from IScreenListener
void OnScreenOn()
{
// do as you like
}
void OnScreenOff()
{
// do as you like
}
}
这里,IScreenListener接口提供了两个纯虚拟方法OnScreenOff和OnScreenOn,它们将在代码中实现。这个示例基于Bada的屏幕侦听器:它允许您获得此类事件的通知。
当然,还有其他好处。比如对用户隐藏代码库的实现细节,等等。
接口(纯抽象类)提供一般功能。在您的示例中,类Shape是泛型的。这意味着您不能从类Shape中获得实际实例(或对象)。你可以说矩形是一个形状或者三角形是一个形状。除非知道形状是什么,否则无法计算形状的面积或周长。
接口(纯抽象类)强制执行一个协议,从它派生的类必须实现它的所有方法。否则,它也会变成一个接口。接口指针可以发送给函数或其他类,从那里你可以调用实际派生类的功能。
例如,如果有一个叫做Animal的类,你从那里派生出所有的动物,比如狗,蛇,人等等,你可以发送Animal指针数组(实际上是它的派生类的实例),然后调用Run(), Walk(), Eat()等功能。
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 为重写std::exception的库生成swig接口时出错
- 内联如何影响模块接口中的成员函数
- COM 接口 c# 封送数组数组
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如何绑定 C++ gRPC 客户端的网络接口
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何从实现接口的模板化类实例访问结构
- 带有进度表的 curl 多接口程序
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 我可以在具有一个标头和一个接口的 cpp 文件中有多个嵌入吗?
- 类接口,可以创建N个方法
- 类具有相同的接口,但参数的类型不同
- 如何与 Cheerp/js 中的 extern 变量接口?
- 如何使用现代 CMake 安装捆绑的接口依赖项?