- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我有纯抽象类 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
这可以通过 protected 继承和隐式转换来完成吗?我只设法得到:
conversion from 'MyEngine *' to 'IHandler *' exists, but is inaccessible
由于我是C#出身,所以这基本上是C#中的显式接口(interface)实现。这是 C++ 中的有效方法吗?
附加:
为了更好地了解我为什么要这样做,请考虑以下内容:
类 TcpConnection
通过 TCP 实现通信,并且在其构造函数中需要指向接口(interface) ITcpEventHandler
的指针。当 TcpConnection
在套接字上获取一些数据时,它使用 ITcpEventHandler::incomingData
将该数据传递给它的 ITcpEventHandler
,或者当它轮询传出数据时它使用 ITcpEventHandler::getOutgoingData
。
我的类 HttpClient
使用 TcpConnection
(聚合)并将自身传递给 TcpConnection
构造函数,并在这些接口(interface)方法中进行处理。
所以 TcpConnection
必须实现这些方法,但我不希望使用 HttpClient
的用户直接访问 ITcpEventHandler
方法(传入数据
,获取传出数据
)。他们不应该能够直接调用 incomingData
或 getOutgoingData
。
希望这能澄清我的用例。
最佳答案
使用 protected
派生使得基类的成员无法通过指向派生类的指针访问,并且不允许隐式转换。
在我看来,你想要的不是禁止通过基类(接口(interface))访问,而是禁止通过派生类(具体实现)访问:
class IHandler
{
public:
virtual int process_input(char input) = 0; //pure virtual
virtual std::string name() { return "IHandler"; } //simple implementation
};
class MyEngine : public IHandler
// ^^^^^^
{
protected: // <== Make the functions inaccessible from a pointer
// or reference to `MyEngine`.
virtual int process_input(char input) { return 0; } //override pure virtual
using IHandler::name; //use IHandler version
};
在这里,在派生类中,您基本上覆盖了 process_input
函数的可见性,以便客户端只能通过指针或对基类的引用来调用它们。
这样你就可以做到:
MyEngine* ptr = new MyEngine();
ptr->process_input('a'); // ERROR!
std::cout << ptr->name(); // ERROR!
但这将是可能的:
IHandler* ptr = new MyEngine();
ptr->process_input('a'); // OK
std::cout << ptr->name(); // OK
关于C++ - 允许通过基类(接口(interface))访问,禁止通过派生类(具体实现)访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15571044/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!