Java:没有接口实现?

时间:2009-01-29 18:11:33

标签: java c++ interface design-patterns

今天我收到了邮件中的“Head First Design Patterns”一书。到目前为止非常有趣的东西,但我对它的内容有疑问。

我没有Java / C#背景,我现在也不想跳到这些语言(我首先想要专注于C ++)。在本书中说java没有接口实现...这意味着对于该接口的每次更改,您都必须修改实现该接口的所有子类。

这是如何在C ++中完成的?我错过了什么?

6 个答案:

答案 0 :(得分:8)

本书的作者的意思是,如果您更改接口成员的签名或添加新签名,您将需要在实现类中进行这些更改,以便他们继续实现接口。

只要您使用完全相同的签名(即,具有相同的名称,返回类型以及参数的顺序和类型)实现接口的成员,您就可以以任何方式更改实现类。 / p>

我的印象是你不太明白界面是如何工作的,所以我建议阅读C# interface specification on MSDN,我认为这个主题非常清楚(除了在Java中,它几乎与Java相同) Java使用“ implements ”关键字而不是冒号(:)来声明类实现特定接口。)

答案 1 :(得分:2)

...如果你想在界面中更改方法的签名,一个好的IDE(eclipse,netbeans ......)可以帮助你重构实现这个接口的所有类。

答案 2 :(得分:1)

Java接口的C ++等价物只是一个只有纯虚方法的类。

你提到你已“看到很多这些Runnable / Threadable接口可以在不触及那些子类的情况下进行修改。”很难从你的描述中肯定地说,但你之前看到的是这样的事情:

Runnable r = new Runnable() {
    public void run() {
        // do something here
    }
};

这是一个实现Runnable接口的匿名类;它不会以任何方式修改界面。

答案 3 :(得分:1)

C ++中的情况也是如此。

C ++没有interface关键字,但纯虚拟类与所有纯虚方法一样,是一样的想法。

如果你在纯虚拟类中更改了方法签名,那么它的所有子类都必须遵循以便编译。

答案 4 :(得分:0)

interface定义了一个实现接口的类应遵循的合同。这类似于抽象基类 - 它基本上将方法的实现委托给派生类。

是的,如果您修改了界面 - 您必须修改实施该界面的所有类。我的猜测是你在Java代码中看到的Runnable实例是实际实现Runnable而不是修改接口本身的匿名类。

Runnable myOwnThread = new Runnable() {
  public void run() {
   // Do something here
  }
};

在Java中,不允许修改标准库中提供的接口(和类)。 C ++中的等价物可以是纯虚拟类

答案 5 :(得分:0)

好的,我会问他显而易见的问题:

如果你想用C ++做设计模式,为什么你会阅读原版Gang of Four Design Patterns书以外的任何其他内容?

是的,带有纯虚方法的C ++类相当于Java或C#接口。