在面向对象编程中,我已经读过你应该编程到一个接口而不是一个实现,但它们是指文字接口(根本没有共享代码)?
是否可以编程为一个接口的抽象基类,除了在这个“接口”中有变量,所有子类都应该有变量?跨子类复制变量会带来不便,因为如果我更改了其中一个子类中的一个变量的名称,我将不得不在所有子类中更改该变量的名称。
遵循“程序到接口而非实现”的原则,这是可以的,还是会在抽象基类和程序之上创建另一个接口到该接口?
答案 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 helpful或this one和of course this one。