web-dev-qa-db-ja.com

C ++ 1つのクラスのみに固有の関数を呼び出す可能性のある共通インターフェースを構築する方法

実行時に読み込まれる共有ライブラリであるいくつかの異なるバックエンド用の共通インターフェースを、使用しているプラ​​ットフォームに依存して構築しています。基本的には次のコードのようになります。私の問題は、すべてのバックエンドの機能の90%が同じ(実装が異なるだけで目的は同じ)の一方で、他のプラットフォームではまったく利用できない機能を備えているものがあることです。

すべての機能にラッパー関数がある場合、それらをサポートしていないバックエンドのボイドにぶつかるので、避けたいものです。また、エラーを返すだけのバックエンド関数を実装するという考えも好きではありません。

ユーザーが自分のアプリケーションをそのプラットフォームに制限したい場合に、バックエンドに固有の関数を呼び出すことができる一方で、一般的な共通インターフェースを使用するための良い方法は何でしょうか?

class CommonInterface
{
    void DoA(); // Calls InternalDoA() of loaded backend

    void DoB(); // Calls InternalDoB() of loaded backend

    void DoC(); // Calls InternalDoC() of loaded backend ???
};

class BackendOne
{
    void InternalDoA();

    void InternalDoB();

    // DoC does not exist!
};

class BackendTwo
{
    void InternalDoA();

    void InternalDoB();

    void InternalDoC();
};

よろしくお願いします!

2
Stargazer

また、エラーを返すだけのバックエンド関数を実装するという考えも好きではありません。

通常、これには万能のソリューションはありません。最も適切なソリューションについて、ケースバイケースで決定する必要があります。

ここにいくつかのオプションがあります:

1)DoCの空または「ダミー」の実装を作成します確実に知っている利用できないこの機能Cの呼び出しに反応しない場合は、ユーザーの視点。

2)Cが利用できないという事実を呼び出し元が無視してはならない場合は、エラーを返すか例外をスローします。それについて不健康に感じないでください。好きかどうかにかかわらず、これは多くの場合正しいアプローチです。例外をスローする場合は、ドキュメントにその旨を明記して、APIユーザーに処理を要求する必要があります。また、呼び出し元がコンテキスト内のエラーを無視できると思った場合でも、そうすることを選択できます。

3)実際に関数「DoC」を呼び出す/呼び出さない前に、ユーザーが機能Cの可用性を照会する必要があると思われる場合は、bool IsFeatureCAvailable()のようなものをインターフェースに提供することもできます(そしてエラーを返します) from DoC利用できないにもかかわらずユーザーが呼び出した場合)。

4
Doc Brown