在C++中,我经常需要使用NVI来确保我的API的一致性。虽然我在C#中看不到它被广泛使用,但我想知道这是因为C#作为一种语言提供了使NVI变得不必要的功能吗?(在需要时,我仍然会在C#中使用NVI。)
interface
类型,而NVI则依赖于“interface”实际上是一个基类。无论如何,在C++中都是这样做的,所以它自然适合在那里使用。Trey Nash在他的书Accelerated C#中,推广NVI模式作为C#中的规范形式。
我不知道你所引用的文章(More C++ Idioms/Non-Virtual Interface)是谁写的,但我觉得作者没有抓住重点。
...
我认为,在C#中,从哲学上讲,完全抽象的类(即没有任何实现)与接口之间几乎没有区别。表面上,它们都可以提供可执行的方法签名,并要求其他东西来实现该功能。
在C#中,如果您需要一个接口,则始终应编写一个接口。只有在您还想要实现重用时,才使用(抽象)基类。
许多代码库将这些组合在一起,并在提供类层次结构作为接口的默认实现的同时编写接口。
如果您在C ++中使用NVI的唯一动机是拥有接口,则不,您不会在C#中使用此功能,因为语言/CLR提供了接口作为一流特性。
在我看来,NVI从来都不是关于接口。它总是实现模板方法模式的一种绝佳方式。
其有用之处体现在代码生命周期维护(易于更改、扩展等)方面,并提供了更简单的继承模型。
我的意见:是的,在C#中,NVI非常有用。
我认为在C#中,NVI和在C++中一样有用。我经常在我的公司看到它被广泛使用。