我想避免在不需要时使用界面。例如,有一个接口AAA
,并且有一个类AAAImpl
实现它,此接口AAA
仅由AAAImpl
和AAAImpl
实现只实现一个接口,即AAA
。这样做的论点是代码解耦,单元测试会更容易,将来会增加更多功能等等。
这些论点有效吗?
答案 0 :(得分:3)
实现一个接口的一个类是设计类库的完全有效的策略,只要您的类的用户无法直接访问实现类。这是隐藏在最佳状态的信息:用户可以看到他们需要查看的内容,同时您可以通过多种方式重新设计实现,而不是让用户直接访问实现类。
这也使您的用户可以灵活地测试他们的代码,而无需依赖于接口定义之外的任何代码。
总的来说,这是一个双赢的局面。
就接口的不良用途而言,有很多可能性:
B<A<float>>
或IComparable<T>
添加到可变类中。答案 1 :(得分:0)
接口的一个不好的用途是当iterface有更多需要它时,实现接口的类必须实现通常不应该的所有那些方法。
例如,我们有打印界面,我们有许多不同版本的打印(从没有页脚的html文档,从带有页脚的html文档,从pdf等)。
所以我们的界面将如下所示:
public interface IPrinter{
public void printHtmlWithFooter();
public void printHtmlWithoutFooter();
public void printPdf();
}
然后你有实现:
public class HtmlPrinter implements IPrinter{
public void printHtmlWithFooter(){
// some code, printing ....
}
public void printHtmlWithoutFooter(){
// some code, printing ....
}
public void printPdf(){}
}
public class PdfPrinter implements IPrinter{
public void printHtmlWithFooter(){}
public void printHtmlWithoutFooter(){}
public void printPdf(){
// some code, printing ....
}
}
如您所见,您需要在每个类中实现所有这些方法,即使它们完全为空。让我们假设您有10个不同的类来实现IPrinter接口,并且您希望在接口中添加一个额外的方法,因此您需要在每个类中执行。 这将是您不应该使用接口的示例之一。
而不是你应该只有:
public interface IPrinter{
public void print();
}
然后客户端不关心它将如何打印以及什么,他只知道必须调用方法print(),就是这样。具体的课程应该注意具体的实施。