一.输出效果
橙色框出部分为控制台输入, 模拟心跳包反馈的目前活动的仪器. 可见若两台机器中的331工作中收到331心跳包反馈, 则继续工作, 收到其他心跳包反馈则停止工作, 切换到335工作. 335同理.
二.设计思路
设计类图:
设计思路: ODU335继承已有仪器ODU的方法与字段( 变量 ), 极大简化升级更新所需编码量. override强调重写父类方法获取名字(string name() )及获取心跳包反馈( bool heartbeat() ).
父类:
ODU.h
#pragma once
#include <iostream>
using namespace std;
/*
实现:发射频率(txFreq-frequence),
接收频率(rxFreq),
发射功率(txPower-transmit power),
的读取与设置;
接收电平(rxL-receive level)
的读取;
心跳包(heartBeat)
正在工作类型与工作状态的获取;
获取设备名称(name)与设备类型(type)
初始化:
txFre = 34400;
rxFre = 31100;
txPower = 20;
rxL = 0;
type = ODU_TYPE::ODU_TYPE_331;
*/
enum class ODU_TYPE {
ODU_TYPE_331,
ODU_TYPE_335,
ODU_TYPE_FUTURE
};
#define ODU_TYPE_331_FLAG "331"
#define ODU_TYPE_335_FLAG "335"
class ODU
{
public:
ODU(ODU_TYPE oduType = ODU_TYPE::ODU_TYPE_331);
int getTxFreq();// 发射频率
void setTxFreq(int);
int getRxFreq();// 接收频率
void setRxFreq(int);
int getTxPower();// 发射功率
void setTxPower(int);
int getRxLevel();// 接收电平
virtual bool heartBeat();// 心跳包
virtual string name();
ODU_TYPE type;
private://为何不设为protected--唯一差别是子类访问权限,子类(ODU335)不需要访问(ODU331)
int txFreq;
int rxFreq;
int txPower;
int rxLevel;
};
ODU.cpp
#include "ODU.h"
ODU::ODU(ODU_TYPE oduType)
{
cout << name() << __FUNCTION__ << endl;
txFreq = 34400;
rxFreq = 31100;
txPower = 20;
rxLevel = 0;
type = oduType;
}
int ODU::getTxFreq()
{
cout << name() << __FUNCTION__ << endl;
return txFreq;
}
void ODU::setTxFreq(int txFreq)//只有继承的才可以加冒号写rxFreq(rxFreq)
{
cout << name() << __FUNCTION__ << endl;
this->txFreq = txFreq;
}
int ODU::getRxFreq()
{
cout << name() << __FUNCTION__ << endl;
return rxFreq;
}
void ODU::setRxFreq(int rxFreq)
{
cout << name() << __FUNCTION__ << endl;
this->rxFreq = rxFreq;
}
int ODU::getTxPower()
{
cout << name() << __FUNCTION__ << endl;
return txPower;
}
void ODU::setTxPower(int txPower)
{
cout << name() << __FUNCTION__ << endl;
this->txPower = txPower;
}
int ODU::getRxLevel()
{
cout << name() << __FUNCTION__ << endl;
return rxLevel;
}
bool ODU::heartBeat()
{
cout << name() << __FUNCTION__ << endl;
cout << name() << "模拟串口协议读取数据:获取心跳包的反馈..."
<< "【" << ODU_TYPE_331_FLAG << "】" << endl;
string response;
cin >> response;
if (ODU_TYPE_331_FLAG == response) {
type = ODU_TYPE::ODU_TYPE_331;
return true;
}
//else if (ODU_TYPE_335_FLAG == response)//这个在ODU335中改写即可
//{
// type = ODU_TYPE::ODU_TYPE_335;
// return false;
//}
return false;
}
string ODU::name()
{
return ODU_TYPE_331_FLAG;
}
子类:
ODU335.h
#pragma once
#include "ODU.h"
class ODU335 : public ODU
{
public:
ODU335(ODU_TYPE oduType = ODU_TYPE::ODU_TYPE_335);
bool heartBeat() override;//重写虚函数时注意!名字是否相同!
string name() override;
};
ODU335.cpp
#include "ODU335.h"
ODU335::ODU335(ODU_TYPE oduType):ODU(oduType)
{
cout << name() << __FUNCTION__ << endl;
}
bool ODU335::heartBeat()
{
cout << __FUNCTION__ << endl;
cout << name() << "模拟串口协议读取数据:获取心跳包的反馈..."
<< "【" << ODU_TYPE_335_FLAG << "】" << endl;
string response;
cin >> response;
if (ODU_TYPE_335_FLAG == response) {
type = ODU_TYPE::ODU_TYPE_335;
return true;
}
return false;
}
string ODU335::name()
{
return ODU_TYPE_335_FLAG;
}