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

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

---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。





猜你喜欢

转载自blog.csdn.net/baidu_27276201/article/details/78378704