0

我正在编写一些接口,但我现在所做的方式似乎违背了接口的目的。原因是我需要先实例化一个实现实例,然后才能使用接口,如下所示:

Interface interfaceName = new InterfaceImplementation(someRequiredValueForConstructor);

这对我来说没有意义,因为我相信接口的意义在于用户不应该调用实现,但有必要按照我现在设置它们的方式这样做。接口被声明为接口,实现被声明为实现该接口的类。我应该如何设计我的接口,以便用户不必直接使用实现?

4

4 回答 4

3

接口的重点是指定所有实现都遵循的协定。实例化时您必须使用某种特定的实现,否则您会选择哪种实现?

使用接口输入内容的好处是,如果需要,您可以轻松地换出实现(例如,ArrayList<T>用换出 an LinkedList<T>;如果您使用 输入变量List<T>,则此更改应该是无缝的)。使用接口还会使您的代码与特定实现的耦合度大大降低。

此外,当您使用依赖注入或控制反转之类的东西时,您可以使用接口键入依赖项。如果您使用的是支持的框架(如 Spring),它可能足够聪明,可以为您找到实现。您还可以告诉框架使用接口的特定实现。但关键是您的代码不期望任何特定的实现,这意味着您可以在未来将它们切换出去,如果需要的话。

于 2013-11-12T16:55:37.450 回答
1

有一些模式,如抽象工厂和其他模式,可以将实现的创建传递到用户不必担心的地方,但接口的主要思想不是让“用户永远不会调用实现”。毕竟你一直在使用这个List界面ArrayLists

于 2013-11-12T16:55:15.960 回答
1

Aninterface允许你开发一个类必须遵循的契约。例如,如果您有一个Radio类,您可以使用以下方法定义一个接口:

public void Send(String msg);- 通过射频传输字符串。

public String Listen();- 通过 RF 监听字符串。

现在,当您实际创建特定类型的 时Radio,您必须实现上述方法:

public class MyRadio implements Radio
{
    @Override
    public void Send(String msg)
    {
        // Implementation specific details for MyRadio
    }

    @Override
    public String Listen()
    {
        // Implementation specific details for MyRadio
    }
}

然后,您可以执行以下操作:

Radio radio = new MyRadio();
于 2013-11-12T16:57:55.877 回答
0

我认为您混合了两个概念,因此感到困惑。

  1. 我们只需要在消费者类中使用接口方法,这使得使用实现独立。

  2. 您可以将接口实现类的实例化部分外部化到公共位置,以使使用更清晰,例如工厂模式。这就是“Spring 依赖注入”的核心。

请注意,接口的行为就像标记一样,如果没有具体的实现,它们将无法工作。

于 2013-11-12T16:56:44.013 回答