【发布时间】:2013-03-22 13:04:10
【问题描述】:
假设我有纯抽象类 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 的通信,并且在其构造函数中需要指向接口ITcpEventHandler 的指针。
当TcpConnection 在套接字上获得一些数据时,它使用ITcpEventHandler::incomingData 将该数据传递给它的ITcpEventHandler,或者当它轮询传出数据时它使用ITcpEventHandler::getOutgoingData。
我的类HttpClient 使用TcpConnection(聚合)并将自身传递给TcpConnection 构造函数,并在这些接口方法中进行处理。
所以TcpConnection 必须实现这些方法,但我不希望使用HttpClient 的用户直接访问ITcpEventHandler 方法(incomingData、getOutgoingData)。他们应该无法直接致电incomingData 或getOutgoingData。
希望这能澄清我的用例。
【问题讨论】:
-
我不明白这个问题,'通过 MyEngine* 访问'是什么意思,'暴露实现细节'是什么意思。
-
我不希望用户在 MyEngine 类中使用 IHandler 方法,除非他们通过 IHandler 接口访问 MyEngine。
标签: c++ inheritance casting abstract-class explicit-implementation