2

我正在升级为特定硬件接口编写的旧应用程序。我现在需要在现有应用程序中添加对现代硬件的支持。

为此,我想为每种硬件类型创建一个类,并在用户选择其系统中的硬件时为一种类型或另一种类型分配一个变量。

例如:

ClassHardwareType1和 ClassHardwareType2都存在具有相同的成员函数。

object HW;  
if (userHwType = 1)  
    // initialize HW as a HardwareType1 class
}  
else{  
    // initialize HW as a HardwareType2 class  
}

现在HW.doSomething(),每次与硬件交互时,我都可以在没有硬件类型条件的情况下使用整个代码。

我敢肯定这是非常基本的,但老实说,我什至不知道这叫什么,也不知道要搜索什么术语。

谢谢!

4

4 回答 4

9

创建一个抽象基类,并从中派生两个具体类:一个实现 type1,另一个实现 type2:

class Hardware
{
public:
    virtual ~Hardware() {};
    virtual void doSomething() = 0;
};

class Hardware1: public Hardware
{
public:
    void doSomething() { // hardware type1 stuff. }
};


class Hardware2: public Hardware
{
public:
    void doSomething() { // hardware type2 stuff. }
};

然后创建必要的实例:

std::unique_ptr<Hardware> hardware(1 == userHwType ? new Hardware1() : 
                                                     new Hardware2());

hardware->doSomething();

如果您的编译器不支持 C++11,那么std::unique_ptr您将无法使用。另一种智能指针将boost::scoped_ptr(或boost::shared_ptr)。

于 2012-06-25T20:37:51.897 回答
3

将多态性与通用抽象基类一起使用,如下所示:

class HardwareBase
{
public:
    virtual void Open() = 0;
    virtual void Close() = 0;
    virtual ~HardwareBase() {};
};

然后推导出您的具体硬件类型:

class HardwareType1 : public HardwareBase
{
public:
    virtual void Open() {...}
    virtual void Close() {...}
};

并选择所需的硬件实例:

std::unique_ptr<HardwareBase> hw;  
if (userHwType == 1)  
    hw.reset(new HardwareType1());
else
    hw.reset(new HardwareType2());

// And use it like this:
hw->Open();

请注意,您现在需要一个指向所选对象实例的指针。使用 unique_ptr 在退出时自动删除它。

于 2012-06-25T20:47:53.627 回答
1

要搜索的术语是polymorphism;这是通过通用接口与不同类型交互的通用术语。

在 C++ 中,如果您需要在运行时选择行为,通常的方法是定义一个抽象接口,它充当具体类型的基类,使用虚函数- 在运行时根据真实类型选择要调用的函数的对象。

// Abstract interface
class Hardware {
public:
    virtual ~Hardware() {}  // needed to safely delete objects

    virtual void doSomething() = 0;  // must be implemented by each concrete type
};

// One concrete type
class HardwareType1 : public Hardware
{
    HardwareType1() { /* initialise */ }
    void doSomething() { /* implementation for this type of hardware */ }
};

// Another concrete type
class HardwareType2 : public Hardware
{
    HardwareType2() { /* initialise */ }
    void doSomething() { /* implementation for this type of hardware */ }
};

现在您可以选择创建哪个,然后使用抽象接口进行交互:

// Create the correct type, depending on user input
std::unique_ptr<Hardware> hw
    ((userHwType == 1) ? new HardwareType1 : new HardwareType2);

// Do the right thing depending on the type
hw->doSomething();
于 2012-06-25T20:43:20.533 回答
0

您可以搜索工厂方法。这是您尝试实现的模式的名称

于 2012-06-25T20:37:33.063 回答