是否在c#中使用了pimpl习语?

Leg*_*ion 15 c# c++ pimpl-idiom

我来自C#背景,最近开始学习C++.我遇到过的一件事是pimpl成语.我为一些大公司做过C#开发,但从未遇到过它.

也许这是错误的,但我的理解是,由于使用头文件而没有部分类选项,因此在C++中这是必要的.

但在C#中,我们会一直使用类库构建应用程序.如果库代码中的内容发生了变化,我们会将其重新编译为dll并在应用程序项目中引用新的dll.

我真的不明白为什么用C++不能做同样的事情.Pimpl对我来说就像是一个丑陋的黑客.

Eri*_*ert 26

是否在c#中使用了pimpl习语?

这取决于你这个成语的意思.

有问题的习惯用法主要是将类型的实现细节分成一个类,将公共表面区域分成一个包装类,它只是保存到实现类的指针.

这有两个好处.

首先,在C++中,它可以改善编译时间,因为公共表面区域的消费者只需要解析包含公共表面区域的头文件; 他们不需要解析包含实现细节的头文件.

其次,它导致界面与实现的非常清晰的分离; 实施可以彻底改变,而不会对消费者产生任何影响,因为消费者永远不会看到实施细节.

第一个好处是无论在C#中.C#编译器很快.(当然,很大程度上是因为语言设计得很快才能编译.)

第二个好处是在C#中有相当大的用处.在C#中,实现此模式的惯用方法是创建一个执行"真实"工作的私有嵌套类,以及一个仅与公共表面区域相关的公共类.

的技术我特别喜欢在C#是使公共类的基类的私有嵌套类的,给基类的私有构造,以防止第三方扩展,并使用工厂模式来伸手,私人嵌套类的实例.

我真的不明白为什么用C++不能做同样的事情.

然后我鼓励你尝试编写一个这样做的C++编译器.你要么成功创建一个更快的C++编译器,要么你会发现为什么在C++中不能做同样的事情.无论哪种方式都有益!

  • @Brian:当然,如果你有一个完全独立的琐碎课程,那么在一堂课中完成所有课程.但是如果你有一个基类BankAccount和派生类SavingsAccount和ChequingAccount,然后从它们那里得到更多的派生类......你想要除了基类之外的所有类都是BankAccount的私有实现细节呢?您可以将它们设置为程序集内部,也可以将它们设置为某个类型的私有.后者强调*给你的同事*这些类是私人实现细节,而不是重复使用的公平游戏. (4认同)
  • 创建私有嵌套类有什么好处,而不是跳过私有嵌套类但仍然使用私有构造函数和工厂方法?您是否可以通过仅将相关成员和字段设为私有来隐藏实施细节? (2认同)