非虚拟接口(NVI)习语在C#中是否与在C++中一样有用?在C++中,我经常需要NVI来实现API一致性。不过,我没有看到它在C#中使用了那么多。我想知道是否是因为C#作为一种语言提供了使NVI变得不必要的功能?(尽管如此,我仍然在C#中使用NVI。)我认为这只是因为在C#中,“传统”Java风格的OOP更加根深蒂固,而NVI与此背道而驰。C#具有真正的接口类型,而NVI依赖于“接口”实际上是基类。不管怎样,这是用C++完成的,所以很自然。在C#中,它仍然可以完成,它仍然是一个非常有用的习惯用法(我想说,比“普通”接口更多),但它要求您忽略内置的语言功能。许多C#程序员不会将NVI类视为“合适的接口”。我认为这种心理阻力是C#不太常见的唯一原因。C#通过取消多重继承解决了NVI问题。虽然我认为多重继承的好处不止于此,但它(大部分)对于NVI来说是必需的。最容易想到的是:C#中的一个类不能实现多个NVI。一旦发现C#/NVI串联的这个令人不快的方面,放弃NVI比放弃C#容易得多。顺便说一下方面。这是一个非常有趣的概念,与NVI的目标完全相同,只是它试图看到问题的“真实性质”并“适当地”解决它,可以这么说。看一看。就.NETFramework而言,有一种机制可以做到这一点:将“正交”代码注入手头的主要逻辑。我说的是MarshalByRef/TransparentProxy的所有业务,我相信您已经听说过。虽然它确实严重影响了性能,所以这里没有运气。也有很多尝试用其他技术来实现相同的概念,从构建门面到上面提到的肮脏业务再到MSIL后处理。后一种方法恰好是真正吸引您的方法,因为它可以变得透明(通过将所需步骤组合到一个构建例程中),它不会影响性能(实际执行“正交”代码绝对必要)并且它不涉及任何类型的“黑客攻击”或逆向工程,因为MSIL是开放的并且有据可查。可以在此处找到对这些要点的更详细讨论,以及指向更多信息和实际工具的链接。您也可以出于同样的目的使用谷歌。?祝你好运。TreyNash在他的“AcceleratedC#”一书中将NVI模式推广为C#中的规范形式。我不知道您引用的文章是谁写的(更多C++习语/非虚拟接口),但我觉得作者没有抓住要点。...接口与抽象类在我看来,从哲学上讲,完全抽象类(即没有任何实现)和接口之间几乎没有区别(在C#中)。从表面上看,它们都提供了可以执行的方法的签名,并且需要其他东西来实现该功能。使用C#,如果您只需要一个接口,您将始终针对该接口进行编程。您只使用(抽象)基类,因为您还想启用重用。除了提供类层次结构作为接口的默认实现之外,许多代码库还将这些和程序组合到接口中。用于C语言接口的NVI如果您在C++中使用NVI的唯一动机是拥有一个接口,那么不,您不会在C#中使用它,因为语言/CLR将接口作为一流函数提供。NVI和对象层次结构在我看来,NVI从来都不是关于接口的。它始终是实现模板方法模式的绝佳方式。有用性体现在代码生命周期维护(易于更改、扩展等),并提供更简单的继承模型。我的意见:是的,NVI在C#中非常有用。我认为NVI在C#中和在C++中一样有用。我看到它在我的公司使用了很多。C#学习教程就是这些:非虚拟接口(NVI)习惯用法在C#中是否与在C++中一样有用?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
