是否可以声明方法的返回类型,例如IList比你在内部定义它少,例如名单?它会编译运行吗?
protected static IList<String> GetJobFiles(String folder, String fileExtension)
{
List<String> jobFiles = new List<String>();
if (System.IO.Directory.Exists(folder))
{
string[] files = Directory.GetFiles(folder, fileExtension);
// Check if for matching files
if (files.Length > 0)
{
// add the files to our list collection
jobFiles.AddRange(files);
}
}
return jobFiles;
}
答案 0 :(得分:8)
这不仅是好的,而且是良好的实践以及将接口作为抽象的全部观点。请参阅维基百科上的LSP
。
它允许您使用 IList<T>
的任何实现者(因此,不仅仅是List<T>
,以防您想要更改内部实现)。
关于“它会编译运行”的问题 - 答案是肯定的,但是,我鼓励你自己尝试。您将在此处了解更多,更快...
正如@Dan Tao评论,请亲自尝试,但要确认(无论是在这里还是与有经验的同事一起)。
答案 1 :(得分:4)
IList<string>
接口由List<string>
和string[]
实现。
所以你可以返回jobFiles
,或者,让我们说你认为没有必要,你想直接返回files
。
您已将方法定义为返回IList<string>
而不是List<string>
的实现,这样您就可以执行此操作而不会影响任何外部代码 *。这实际上是使用接口的主要目的之一。
*这假设您不会使用例如Add
,Insert
等将返回值视为可变集合。否则,您实际上会影响外部代码;但这在理论上至少是接口的一个好处。
答案 2 :(得分:1)
请注意,根据返回值的预期用途,您甚至可以选择返回IEnumerable:
protected static IEnumerable<String> GetJobFiles(String folder, String fileExtension)
这更为通用,您可以在内部使用多种类型来构建列表(集合,队列,堆栈或仅使用yield的枚举器),而不会影响调用者。
在这种情况下,函数的调用者可以遍历“作业文件”,使用linq中的枚举(他也可以使用IList)。
调用者无法修改列表(他无法添加或删除文件)。
答案 3 :(得分:0)
由于IList比List更“通用”(在该List中实现了IList接口),因此这是一种非常好的方法。
答案 4 :(得分:0)
是的,这就是界面的目的。您指定将返回实现列表界面的内容。如果你想要几个类(Say Dog,Cat,Bird等)都实现了IAnimal(Say有Feed()和Bath()方法)你可以让一个函数返回一个IAnimal而不具体说明哪种类型的动物你会回来的。