c ++基类已调用,但返回派生类

时间:2018-08-22 22:01:50

标签: c++ design-patterns c++98

首先,我与C ++ 98紧密相连,希望我们的供应商(及其供应商)能更新

我正在与一个第三方框架合作,我确实从中获得资源。我不想更改来源以确保我向上和向下兼容。

该框架具有基类Channel以及派生类DigitalAnalog

class Channel
{
    getChannel(std::string chName)
    {
        //returns a Channel  
    }
    bool IsDigital()
    {
       //returns true for digital otherwise false
    }
}

class Digital : public Channel
{
    // functionality for Digital
}

class Analog : public Channel
{
    // functionality for Analog
}

基类允许我通过调用getChannel(std::string chName)方法来找到“频道”。基类还具有方法IsDigital()。当通道为数字通道时该方法返回true,否则为模拟通道。

是否有一种方法(或模式)可用于从基类请求通道并获得DigitalAnalog(派生类)的返回?如果我需要在两者之间建立类来完成它,对我来说还可以。我想避免在程序中获取通道并将其强制转换并以多个变量结束的负担。

Digital* d;
Analog*  a;
Channel* c;

c = framework->getChannel("name");
if (c->IsDigital())
{
   d = dynamic_cast<Digital>(c);       
}
else
{
   a = dynamic_cast<Analog>(c);       
}

我希望可能有这样的事情。在我的主代码中,我使用IO类和helper类,其中helper类与框架一起使用以确定它是数字通道还是模拟通道,并且IO类可以是数字通道或模拟通道。

MyInBetweenClass* helper;
MyOwnClass *ioD;
MyOwnClass *ioA;

ioD = helper(framework->getChannel("digitalname"));
ioA = helper(framework->getChannel("analogname"));

// here do something with ioD acting on the digital IO
//   or do something with ioA acting on the analog IO

1 个答案:

答案 0 :(得分:2)

您可以使用功能模板来实现。

namespace MyApp
{
    template <typename T>
    T* getChannel(Framework* framework, std::string const& cname)
    {
       return dynamic_cast<T*>(framework->getChannel(cname));
    }
}

并使用

Analog*  a = MyApp::getChannel<Analog>(framework, "name");