扩展初始化接口时提出的问题?),我们在实例化接口的同时用实现的类对其进行初始化。
我的问题是,为什么首先要使用Interface实例化它?为什么我不能直接用实现的类实例化它?例如。:
Doc mydoc = new SimpleDoc();
Doc是接口,而SimpleDoc正在实现它。SimpleDoc有什么问题?mydoc = new SimpleDoc(); 哪里会失败?
通常,最好的方法是依赖系统中的抽象类型(接口或抽象类)。
在您的示例中,您确实可以编写:
SimpleDoc mydoc = new SimpleDoc()
但是,问题在于所使用的代码mydoc将取决于具体类型SimpleDoc。但这本身不一定是问题,但是,假设您创建了一个新的实现Doc,例如ComplexDoc。
mydoc
SimpleDoc
Doc
ComplexDoc
您可以将声明更改为:
ComplexDoc mydoc = new ComplexDoc();
现在,您传递mydoc给的所有place方法也都必须更改。
但是,如果您Doc最初使用过,则只需要进行一次更改:
Doc mydoc = ComplexDoc();
当您使用Collections API时,这非常有用,在这种情况下,通常会转换另一个实现,或者在测试用例中使用Mocking。