这可能是普通C ++用户的基本问题。在功能上,我有一个ECG监视器,并希望选择在运行时使用哪种输出格式。我已经设置了两个暴露相同方法和成员的类(例如,ECGRecordingDefaultFormat和ECGRecordingEDFFormat)。 - > InsertMeasure, - > setFrequency, - > setPatientName等。
我知道我可以定义每个格式类类型的一个实例,然后输入:
if (ECGFormatToUse == ECGFormat.EDF) {
ecgDefaultFormat.InsertMeasure(x);
}
if (ECGFormatToUse == ECGFormat.Default) {
ecgEDFFormat.InsertMeasure(x);
}
整个代码中都有,但我想我可能不会完全使用C ++的动态类型。
问题是:我可以在main()中定义一个变量,并且在运行时选择我想要的格式后,让代码使用正确的类及其公开的“InsertMeasure”方法,避免了大量的if /整个代码中的其他内容?
我很高兴只能参考我应该使用的继承/多态(?)的哪个方面,并且可以将其余部分google。
谢谢你们。
皮特
答案 0 :(得分:6)
您可以将factory pattern与C ++的多态性结合起来。
class Base
{
virtual void InsertMeasure() = 0; //virtual pure, make the base class abstract
};
class ECGRecordingDefaultFormat : public Base
{
virtual void InsertMeasure();
};
class ECGRecordingEDFFormat : public Base
{
virtual void InsertMeasure();
};
class Factory
{
static Base* create(ECGFormat format)
{
if ( format == ECGFormat.EDF )
return new ECGRecordingEDFFormat;
if ( format == ECGFormat.Default )
return new ECGRecordingDefaultFormat;
return NULL;
}
};
int main()
{
ECGFormat format;
//set the format
Base* ECGRecordingInstance = Factory::create(format);
ECGRecordingInstance->InsertMeasure();
return 0;
}
答案 1 :(得分:2)
其他人已经回答了,但是我写了这篇文章:
class EcgFormat
{
public:
virtual void InsertMeasure(int x) = 0;
};
class EcgFormatA : public EcgFormat
{
public:
void InsertMeasure(int x)
{
cout << "EcgFormatA: " << x << "\n";
}
};
class EcgFormatB : public EcgFormat
{
public:
void InsertMeasure(int x)
{
cout << "EcgFormatB: " << x << "\n";
}
};
class EcgFormatFactory
{
public:
static std::shared_ptr<EcgFormat> makeEcgFormat(char a_format)
{
switch (a_format)
{
case 'A':
return std::make_shared<EcgFormatA>();
break;
case 'B':
return std::make_shared<EcgFormatB>();
break;
default:
throw std::exception("Invalid format");
break;
}
}
};
int main()
{
std::shared_ptr<EcgFormat> format = EcgFormatFactory::makeEcgFormat('A');
format->InsertMeasure(5);
return 0;
}
(我知道这与@Luchian的回答几乎相同)。
答案 2 :(得分:1)
有一个抽象的超类EcgFormat
(有几个virtual
方法保持抽象=0
)和几个子类ECGRecordingDefaultFormat
,ECGRecordingEDFFormat
等