(二十三)C++篇-数据抽象与接口

数据抽象
数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。

数据抽象有两个重要的优势:

  • 类的内部受到保护,不会因无意的用户级错误导致对象状态受损。
  • 类实现可能随着时间的推移而发生变化,以便应对不断变化的需求,或者应对那些要求不改变用户级代码的错误报告。

如果只在类的私有部分定义数据成员,编写该类的作者就可以随意更改数据。如果实现发生改变,则只需要检查类的代码,看看这个改变会导致哪些影响。如果数据是公有的,则任何直接访问旧表示形式的数据成员的函数都可能受到影响。

测试代码如下:

#include
using namespace std;

class Adder
{
public:
    // 构造函数
    Adder(int i = 0)
    {   
        total=i;
    }
    // 对外的接口
    void addNum(int number)
    {   
        total+=number;
    }
    // 对外的接口
    int getTotal()
    {
        return total;
    }
    
private:
    // 对外隐藏的数据
    int total;  
};

int main()
{
    Adder a;
    a.addNum(10);
    a.addNum(20);
    a.addNum(30);
    
    cout<<"Total "<< a.getTotal()<

输出结果:

tekken@tekken:~/C++WS$ ./a.out 
Total 60

接口(抽象类)
接口描述了类的行为和功能,而不需要完成类的特定实现。

C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。

如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 "= 0" 来指定的,如下所示:

class Box
{
   public:
      // 纯虚函数
      virtual double getVolume() = 0;
   private:
      double length;      // 长度
      double breadth;     // 宽度
      double height;      // 高度
};

设计抽象类(通常称为 ABC)的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。

因此,如果一个 ABC 的子类需要被实例化,则必须实现每个虚函数,这也意味着 C++ 支持使用 ABC 声明接口。如果没有在派生类中重写纯虚函数,就尝试实例化该类的对象,会导致编译错误。

可用于实例化对象的类被称为具体类。

测试代码如下:

#include
using namespace std;

// 基类
class Shape
{
public:
    // 提供接口框架的纯虚函数
    virtual int getArea()=0;
    void setWidth(int w)
    {
        width=w;
    }
    void setHeight(int h)
    {
        height=h;
    }
protected:
    int width;
    int height;
};

// 派生类
class Rectangle:public Shape
{
public:
    int getArea()
    {
        return(width*height);
    }
};

class Triangle:public Shape
{
public:
    int getArea()
    {
        return(width*height)/2;
    }
};  

int main(void)
{
    Rectangle Rect;
    Triangle Tri;
    
    Rect.setWidth(5);
    Rect.setHeight(7);
    // 输出对象的面积
    cout<<"Total Rectangle area: "<

输出结果:

tekken@tekken:~/C++WS$ ./a.out 
Total Rectangle area: 35
Total Triangle area: 17

你可能感兴趣的:((二十三)C++篇-数据抽象与接口)