我应该编程到接口还是抽象基类?这句话到底意味着什么?

时间:2015-05-06 18:05:45

标签: java c++ oop design-patterns interface

在面向对象编程中,我已经读过你应该编程到一个接口而不是一个实现,但它们是指文字接口(根本没有共享代码)?

是否可以编程为一个接口的抽象基类,除了在这个“接口”中有变量,所有子类都应该有变量?跨子类复制变量会带来不便,因为如果我更改了其中一个子类中的一个变量的名称,我将不得不在所有子类中更改该变量的名称。

遵循“程序到接口而非实现”的原则,这是可以的,还是会在抽象基类和程序之上创建另一个接口到该接口?

2 个答案:

答案 0 :(得分:2)

注意:C ++没有接口。你可能会说它不需要它们。

  

你应该编程到一个接口而不是一个实现,但它们是指文字接口(根本没有共享代码)?

可能。如果这样做有意义,它可以很好地工作。注意:在Java接口中也可以有代码。

  

是否可以编程为一个接口的抽象基类,除了在这个“接口”中有变量,所有子类都应该有变量?

如果在实现中需要字段,则抽象类可以有意义。您仍然可以使用界面。

  

跨子类复制变量会带来不便,因为如果我更改了其中一个子类中的一个变量的名称,我将不得不在所有子类中更改该变量的名称

这是使用IDE的帮助。您可以通过一个操作更改所有代码中的字段,类,方法名称。

  

这没关系,还是会在抽象基类之上创建另一个接口并编程到该接口?

您可以将实现编码为抽象类,但该类的用户应尽可能使用接口。

e.g。 String os = System.getProperty("os.name").toLowerCase(); if(os.indexOf("win") >= 0) { request.getRequestDispatcher("/result.jsp").forward(request, response); } else { request.getRequestDispatcher("/result1.jsp").forward(request, response); } 扩展了HashMap,但实现了AbstractMap。大多数人会使用Map而不是Map

答案 1 :(得分:2)

您希望对接口进行编程,因为这意味着更低的耦合。请注意,Java中的接口更灵活,因为它们可以通过类层次结构中的类 where 实现,这与抽象类(作为单继承的结果)不同。这种灵活性意味着您的代码可以在更高程度上重复使用。

重要的一点是对接口进行编程而不是实现"是上述一般原则的,即使它们可能会造成一些轻微的不便

此外,即使您编程到接口,如果您愿意,也可以通过抽象类实现所述接口(或部分接口),同时实现低耦合和代码可重用性。

总是可以编程抽象甚至具体的课程,但如果你能避免它,它会更好。

This discussion might be helpfulthis oneof course this one