2

特定のハードウェアインターフェイス用に作成された古いアプリケーションをアップグレードしています。次に、既存のアプリケーションに最新のハードウェアのサポートを追加する必要があります。

これを行うには、ハードウェアタイプごとにクラスを作成し、ユーザーがシステム内のハードウェアを選択するたびに、いずれかのタイプに変数を割り当てます。

例えば:

クラスHardwareType1とクラスHardwareType2はどちらも同じメンバー関数を持って存在します。

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

HW.doSomething()これで、ハードウェアを操作するたびに、ハードウェアタイプの条件なしでコード全体を使用できるようになりました。

これはかなり基本的なことだと思いますが、正直なところ、これが何と呼ばれているのか、これを検索するための用語もわかりません。

ありがとう!

4

4 に答える 4

9

抽象基本クラスを作成し、そこから 2 つの具象クラスを派生させます。1 つは type1 を実装し、もう 1 つは 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

検索する用語はポリモーフィズムです。これは、共通のインターフェイスを介してさまざまな型とやり取りすることを表す一般的な用語です。

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 に答える