非虚拟接口 (NVI) 习惯用法在 C# 中和在 C++ 中一样有用吗?

2024-01-11

在C++中,我经常需要NVI http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-Virtual_Interface以获得 API 的一致性。不过,我认为它在 C# 中的使用并不多。我想知道这是否是因为 C# 作为一种语言提供了不需要 NVI 的功能? (不过,如果需要的话,我仍然在 C# 中使用 NVI。)


C# 通过取消多重继承而给 NVI 带来了问题。虽然我确实认为多重继承弊大于利,但它对于 NVI 来说是必要的(在大多数情况下)。我想到的最简单的事情是:C# 中的一个类不能实现多个 NVI。一旦发现这种不愉快的事情aspect由于 C#/NVI 串联,放弃 NVI 比 C# 更容易。

顺便说一句,谈到aspects。这是一个非常有趣的概念,它的目标与 NVI 的目标完全相同,只是它试图看到问题的“真正本质”并“正确地”解决它,可以这么说。看一看 http://en.wikipedia.org/wiki/Aspect-oriented_programming.

就 .NET Framework 而言,有一种机制可以做到这一点:可以说,注入“正交”的代码到手头的主要逻辑。我正在谈论所有 MarshalByRef/TransparentProxy 业务,我相信您已经听说过它。不过,它确实会严重影响性能,所以这里运气不佳。

人们还多次尝试通过其他技术来实现相同的概念,从建筑立面到上面提到的肮脏业务,再到 MSIL 的后处理。

后一种方法恰好对您最有吸引力,因为它可以变得透明(通过将所需的步骤合并到构建例程中),它不会影响性能(超过实际执行“正交”代码绝对必要的性能)而且它不涉及某种“黑客”或逆向工程,因为 MSIL 是开放的且有详细记录。

Here http://www.sharpcrafters.com/aop.net/compiletime-weaving人们可以找到更详细讨论的这些要点,以及更多信息和实际工具的链接。使用 Google 来达到同样的目的也是可以接受的。 :-)

祝你好运。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非虚拟接口 (NVI) 习惯用法在 C# 中和在 C++ 中一样有用吗? 的相关文章

随机推荐