风格差异:词典与词典

2022-08-31 12:13:41

我有一个朋友,在Java开发多年之后,他刚刚进入.NET开发领域,在看了他的一些代码之后,我注意到他经常这样做:

IDictionary<string, MyClass> dictionary = new Dictionary<string, MyClass>();

他将字典声明为接口而不是类。通常我会执行以下操作:

Dictionary<string, MyClass> dictionary = new Dictionary<string, MyClass>();

我只在需要时使用 IDictionary 接口(例如,将字典传递给接受 IDictionary 接口的方法)。

我的问题是:他的做事方式有什么优点吗?这在Java中是一种常见的做法吗?


答案 1

如果 IDictionary 是比 Dictionary 更“通用”的类型,那么在声明变量时使用更通用的类型是有意义的。这样,您就不必太关心分配给变量的实现类,并且可以在将来轻松更改类型,而无需更改大量后续代码。例如,在Java中,通常认为这样做更好。

List<Integer> intList=new LinkedList<Integer>();

比它要做的

LinkedList<Integer> intList=new LinkedList<Integer>();

这样,我确信下面的所有代码都将列表视为列表而不是LinkedList,这使得将来可以轻松地将LinkedList切换为Vector或任何其他实现List的类。我会说这在Java和一般情况下都是好的编程所共有的。


答案 2

这种做法不仅限于Java。

当您想要将对象的实例与正在使用的类解除耦合时,它也经常在 .NET 中使用。如果使用接口而不是类,则可以在需要时更改支持类型,而不会破坏其余代码。

您还将看到此实践在处理 IoC 容器和使用工厂模式进行实例化时被大量使用。