What is the Difference in the below two set of code
我已经开始学习Java和Selphi了,我想了解下面两组代码之间的区别,它们都执行得很好并且具有相同的行为。
WebDriver是一个接口,由一个实现了所有方法的类FireFoxDriver实现。因此,为了调用FireFoxDriver中存在的方法,我们使用它的构造函数创建了一个firefox对象,但是为什么人们经常使用第一个(在下面的集合中)以及当我们使用类的构造函数来创建对象时它意味着什么,但是我们将接口名(类已经实现)放在了这个类名上,而不是放在了这个类名上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/第二个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sayem是对的,但让我详细解释一下为什么要这样做。
这就允许我们所谓的脱钩。本质上,使用WebDriver的代码只关心它是一个WebDriver,而不是Web Driver的实现。本质上,调用代码应该只关心WebDriver做什么,而不是如何做。
这种脱钩或"分离关注点"的概念是OO的一个基本方面。谷歌可以在这方面吸引大量的文章,这真的值得一读,因为它是一个良好的Java和良好的面向对象编程的基础。
由于
Program to an interface, not to a concrete implementation.
使用第一种方法给了您很大的灵活性,这是程序员遵循的一种最佳实践。通过它们的
有关详细信息,请查看此答案。您还可以查看有效的Java,项目52。
Refer to objects by their interfaces.
作为一个应用面向对象设计原理的实际例子,如果你将程序编程到一个接口上,那么具体的实现就可以交换出来。
如果你有:
1 | FirefoxDriver driver = new FirefoxDriver(); |
如果有人要求您在Chrome或Internet Explorer上运行此测试,会发生什么情况?如果您编程到接口,您可以简单地执行以下操作:
1 | WebDriver driver = new FirefoxDriver(); |
或
1 | WebDriver driver = new ChromeDriver(); |
或
1 | WebDriver driver = new InternetExplorerDriver(); |
这样,您就不必一直执行FireFoxDriver,也不局限于始终执行FireFoxDriver,您可以根据需要将其与接口的其他具体实现交换。