2009-01-29 113 views
0

今天我收到了我的书“Head First Design Patterns”。到目前为止,虽然有趣的东西,但是我对它的内容有疑问。我没有Java/C#背景,也不希望立即跳入这些语言(我想首先关注C++)。在书中说,java没有接口的实现...这将意味着对于每个接口的改变,你将不得不修改实现接口的所有子类。Java:没有接口实现?

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

+0

兴趣点:你可能想看看Jeff对Head First Design Patterns的看法。提示:他不是粉丝。 http://www.codinghorror.com/blog/archives/000380.html – 2009-01-29 18:34:50

+0

我发现这本书非常有帮助。大多数初学者似乎写了一堆意大利面代码,当我说“我们在这里使用模板模式是因为...”时,我不知道我的意思。授予杰夫有一些有效的观点,初学者采取了一些简单的和复杂的(计算机科学它死) – Patrick 2009-01-29 20:55:15

回答

8

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

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

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

1

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

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

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

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

2

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

1

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

C++没有接口关键字,但纯虚拟类和所有纯虚拟方法是相同的想法。

如果您在纯虚拟类中更改了方法签名,则其所有子类都必须遵循才能编译。

0

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

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

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

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

0

好吧,我会askt他很明显的问题:

如果你想要做的设计模式在C++中,为什么你会读出比四种Design Patterns书的原冈其他什么吗?

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