美文网首页
(二十三)C++篇-数据抽象与接口

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

作者: GoodTekken | 来源:发表于2022-07-07 14:41 被阅读0次

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

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

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

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

    测试代码如下:

    #include<iostream>
    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()<<endl;
        return 0;
    }
    

    输出结果:

    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<iostream>
    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: "<<Rect.getArea()<<endl;
        
        Tri.setWidth(5);
        Tri.setHeight(7);
        // 输出对象的面积
        cout<<"Total Triangle area: "<<Tri.getArea()<<endl;
        
        return 0;
    }   
    

    输出结果:

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

    相关文章

      网友评论

          本文标题:(二十三)C++篇-数据抽象与接口

          本文链接:https://www.haomeiwen.com/subject/fdxpbrtx.html