IHandler純粋な抽象クラスとそれから派生したクラスがあるとしましょう:
class IHandler
{
public:
virtual int process_input(char input) = 0;
};
class MyEngine : protected IHandler
{
public:
virtual int process_input(char input) { /* implementation */ }
};
MyEngine でそのクラスを継承して、MyEngine*期待しているすべての人に渡してIHandler*、それらを使用できるようにしたいと考えていますprocess_input。ただし、MyEngine*実装の詳細を公開したくないため、アクセスを許可したくありません。
MyEngine* ptr = new MyEngine();
ptr->process_input('a'); //NOT POSSIBLE
static_cast<IHandler*>(ptr)->process_input('a'); //OK
IHandler* ptr2 = ptr; //OK
ptr2->process_input('a'); //OK
これは、保護された継承と暗黙のキャストを介して行うことができますか? 私はなんとか得ることができました:
「MyEngine *」から「IHandler *」への変換は存在しますが、アクセスできません
私は C# のバックグラウンドを持っているので、これは基本的に C# での明示的なインターフェイスの実装です。これは C++ で有効なアプローチですか?
追加:
なぜこれをやりたいのかをよりよく理解するために、次のことを検討してください。
クラスTcpConnectionは TCP を介した通信を実装し、そのコンストラクターには interface へのポインターが必要ITcpEventHandlerです。ソケットでデータを取得するTcpConnectionと、そのデータをITcpEventHandlerusingに渡します。ITcpEventHandler::incomingDataまたは、送信データをポーリングするときに、 uses を渡しますITcpEventHandler::getOutgoingData。
私のクラスHttpClientはTcpConnection(集約)を使用してTcpConnectionコンストラクターに渡し、それらのインターフェースメソッドで処理を行います。
したがって、これらのメソッドを実装する必要がありますが、使用しているユーザーがメソッド ( 、 )に直接アクセスできるようにしTcpConnectionたくありません。電話をかけたり、直接電話したりできないようにする必要があります。HttpClientITcpEventHandlerincomingDatagetOutgoingDataincomingDatagetOutgoingData
これが私のユースケースを明確にすることを願っています。