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
と、そのデータをITcpEventHandler
usingに渡します。ITcpEventHandler::incomingData
または、送信データをポーリングするときに、 uses を渡しますITcpEventHandler::getOutgoingData
。
私のクラスHttpClient
はTcpConnection
(集約)を使用してTcpConnection
コンストラクターに渡し、それらのインターフェースメソッドで処理を行います。
したがって、これらのメソッドを実装する必要がありますが、使用しているユーザーがメソッド ( 、 )に直接アクセスできるようにしTcpConnection
たくありません。電話をかけたり、直接電話したりできないようにする必要があります。HttpClient
ITcpEventHandler
incomingData
getOutgoingData
incomingData
getOutgoingData
これが私のユースケースを明確にすることを願っています。