当我成为C#爱好者时,我对C ++感到很失望,因为我相信祖先解决了我会比其前任更好地调用接口问题。问题是,你无法摆脱类定义中的私有字段声明,因此对它的封装似乎不那么诚实。例如:
// Righteous.h
#ifndef RIGHTEOUS_H
#define RIGHTEOUS_H
class Righteous
{
public:
void Eat(Food* food);
void Pray(Orison* orison);
void Love(People* person); // by heart, not physically
private:
void WatchHornyVideos(); // oops...
void DoSomethingIllegal(); // hope people will never come here
void DenyGodExistance(); // else I will probably see Him soon
}
#endif
即使C更好地处理隐藏实现任务,因为您可以隐藏它在.c
文件中的函数和字段,将它们编译为.lib
并部署标题和库而不会泄露您的脏密码。
C#元类信息很不错,但现在使用文本编辑器(如记事本或emacs)提取类定义并不方便。此外,C#反射工具允许任何人完全反编译.NET程序集,因此部署程序集是不安全的,甚至是模糊的。
在回答这个问题时,我想看看从第97版到现代版的C ++标准是如何解决的。
答案 0 :(得分:5)
有两种方法可以进一步将界面与实现分开。抽象界面:
class IRighteous
{
public:
virtual void Eat(Food* food) = 0;
virtual void Pray(Orison* orison) = 0;
virtual void Love(People* person) = 0;
virtual ~IRighteous() {}
};
PIMPL:
class Righteous
{
public:
void Eat(Food* food);
void Pray(Orison* orison);
void Love(People* person);
Righteous(); // To construct RighteousImpl and assign it to the _impl.
~Righteous(); // Destructor needs to be defined in cpp where RighteousImpl is defined or included.
private:
std::unique_ptr<RighteousImpl> _impl;
};