UE4-C++核心编程之接口---C++中的接口

来源:互联网 发布:杭州明霖 知乎 编辑:程序博客网 时间:2024/06/13 04:09

接口的出现使面向对象前进了一大步,同时也是很多需求变得有预见性,尤其是接口与继承结合起来使得程序有了“预见未来”的能力。

---Mantra

什么是接口?

接口就是自己提供给外界的一种抽象,用以由内部操作分离出外部沟通的方法,使其内部修改而不影响外界其他实体与交互的方式。

很多编程语言都提供了对于接口的支持,但是很不幸,C++本身不支持接口。但是我们可以通过C++多继承和纯虚函数结合来实现接口。

具体操作方法:

此处略去理论直接上砖(代码)。首先定义IPerson接口,定义了一些行为(纯虚函数)

#pragma once#include <string>class IPerson{public:IPerson() {};// 此处最好规定为纯虚函数,这样可以保证子类能够正确调用析构函数virtual ~IPerson() = 0{};// 以下为定义的接口函数,方便外部调用virtual void SetName(const std::string& strName) = 0;virtual const std::string GetName() = 0;virtual void Work() = 0;};
接下来我们定义两个类,分别实现这个IPerson接口。

首先定义Teacher类(下面分别是.h和.cpp文件):

#pragma once#include <string>#include "IPerson.h"class Teacher:public IPerson{public:Teacher();Teacher(std::string name);virtual ~Teacher();// 通过 IPerson 继承virtual void SetName(const std::string & strName) override;virtual const std::string GetName() override;virtual void Work() override;protected:std::string strName;};
#include "Teacher.h"#include <iostream>Teacher::Teacher(){}Teacher::Teacher(std::string name){strName = name;}Teacher::~Teacher(){std::cout << "Delete Teacher: " << this->strName << std::endl;}void Teacher::SetName(const std::string & strName){this->strName = strName;}const std::string Teacher::GetName(){return this->strName;}void Teacher::Work(){std::cout << "I'm teaching Student" << std::endl;}

接下来定义和实现Student类,同样也实现了IPer'son接口

#pragma once#include "IPerson.h"#include <string>class Student: public IPerson{public:Student();Student(std::string name);~Student();// 通过 IPerson 继承virtual void SetName(const std::string & strName) override;virtual const std::string GetName() override;virtual void Work() override;protected:std::string strName;};

#include "Student.h"#include <iostream>Student::Student(){}Student::Student(std::string name){strName = name;}Student::~Student(){std::cout << "Delete Student: " << this->strName << std::endl;}void Student::SetName(const std::string & strName){std::cout << "Change Student name from " << this->strName << " to "<< strName<<std::endl;this->strName = strName;}const std::string Student::GetName(){std::cout << "You wana get the student name? " << std::endl;std::cout << "But do you have the right...." << std::endl;std::cout << "Em... You have" << std::endl;std::cout << this->strName << std::endl;return this->strName;}void Student::Work(){std::cout << "I'm a goodboy, and I have to study." << std::endl;std::cout << "So my work is Studying" << std::endl;}
接下来在主函数中测试我们写好的程序(其中Headers.h包含了必要的头文件)

#include <iostream>#include "Headers.h"using namespace std;int main(){cout << "Hello World" << endl;// 测试自己写的接口(利用多态)IPerson* Person = new Teacher("Mantra");std::cout << Person->GetName() << std::endl;Person->SetName("MantraGuo");std::cout << Person->GetName() << std::endl;Person->Work();std::cout << "====================================" << std::endl;std::cout << std::endl;std::cout << "华丽的分割线" << std::endl;std::cout << "====================================" <<std::endl;std::cout << std::endl;Person = new Student("NaDaCi");std::cout << Person->GetName() << std::endl;Person->SetName("MantraGuo");std::cout << Person->GetName() << std::endl;Person->Work();return 0;}

一切准备就绪,接下来就是测试啦,结果如下:


最后附上测试用的VS工程。链接:http://pan.baidu.com/s/1i4YMsJj密码:21fl。





原创粉丝点击