今天我收到了我的书“Head First Design Patterns”。到目前为止,虽然有趣的东西,但是我对它的内容有疑问。我没有Java/C#背景,也不希望立即跳入这些语言(我想首先关注C++)。在书中说,java没有接口的实现...这将意味着对于每个接口的改变,你将不得不修改实现接口的所有子类。Java:没有接口实现?
这是如何在C++中完成的?我错过了什么?
今天我收到了我的书“Head First Design Patterns”。到目前为止,虽然有趣的东西,但是我对它的内容有疑问。我没有Java/C#背景,也不希望立即跳入这些语言(我想首先关注C++)。在书中说,java没有接口的实现...这将意味着对于每个接口的改变,你将不得不修改实现接口的所有子类。Java:没有接口实现?
这是如何在C++中完成的?我错过了什么?
本书作者的意思是,如果您更改了接口成员的签名或添加了新成员,您还需要在实现类中进行这些更改,以便他们继续实现接口。
只要您使用完全相同的签名(即具有相同名称,返回类型以及参数的顺序和类型)实现接口的成员,您可以随意更改实现类。
我的印象是,你不太明白接口是如何工作的,所以我建议你阅读C# interface specification on MSDN这个问题,我认为这个问题非常清楚(除了在Java中使用Java之外,它几乎与Java相同“实现”关键字而不是冒号(:)来声明一个类实现了特定的接口)。
Java接口的C++等价物将是一个只有纯虚拟方法的类。
你提到你已经“看到了很多这些Runnable/Threadable接口,可以在不触及这些子类的情况下进行修改”。很难从你的描述肯定地说,但你可能已经见过是这样的:
Runnable r = new Runnable() {
public void run() {
// do something here
}
};
这是一个实现了Runnable
接口的匿名类;它不以任何方式修改接口。
...如果你想改变接口中方法的签名,一个好的IDE(eclipse,netbeans ...)可以帮助你重构实现这个接口的所有类。
C++中的情况也是如此。
C++没有接口关键字,但纯虚拟类和所有纯虚拟方法是相同的想法。
如果您在纯虚拟类中更改了方法签名,则其所有子类都必须遵循才能编译。
interface定义了一个实现接口的类将遵循的合约。这类似于抽象基类 - 它基本上将方法的实现委托给派生类。
是的,如果你修改了界面 - 你将不得不修改所有的类,实现那个接口。我的猜测是,您在Java代码中看到的Runnable实例是实际实现Runnable的匿名类,而不是修改接口本身。
Runnable myOwnThread = new Runnable() {
public void run() {
// Do something here
}
};
在Java中,不允许修改标准库中提供的接口(和类)。 C++中的等价物可以是纯虚拟类。
兴趣点:你可能想看看Jeff对Head First Design Patterns的看法。提示:他不是粉丝。 http://www.codinghorror.com/blog/archives/000380.html – 2009-01-29 18:34:50
我发现这本书非常有帮助。大多数初学者似乎写了一堆意大利面代码,当我说“我们在这里使用模板模式是因为...”时,我不知道我的意思。授予杰夫有一些有效的观点,初学者采取了一些简单的和复杂的(计算机科学它死) – Patrick 2009-01-29 20:55:15