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