今天我收到了邮件中的“Head First Design Patterns”一书。到目前为止非常有趣的东西,但我对它的内容有疑问。
我没有Java / C#背景,我现在也不想跳到这些语言(我首先想要专注于C ++)。在本书中说java没有接口实现...这意味着对于该接口的每次更改,您都必须修改实现该接口的所有子类。
这是如何在C ++中完成的?我错过了什么?
答案 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#接口。