接口使用不当的任何例子?

时间:2016-07-13 20:06:42

标签: java c# oop interface

我想避免在不需要时使用界面。例如,有一个接口AAA,并且有一个类AAAImpl实现它,此接口AAA仅由AAAImplAAAImpl实现只实现一个接口,即AAA。这样做的论点是代码解耦,单元测试会更容易,将来会增加更多功能等等。

这些论点有效吗?

2 个答案:

答案 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(),就是这样。具体的课程应该注意具体的实施。