0

接口和抽象方法真的只是用来确保开发人员在他们的类中包含这些方法吗?

难道这也不能通过使用流程来实现吗?例如测试驱动开发。

好像很不灵活。当代码改变时会发生什么?

我很难理解这些限制的必要性。
当它有可能在未来做更多的工作时,为什么还要在代码中添加一个接口呢?

4

2 回答 2

0

您通常使用接口或抽象类将两个具体类相互分离。

让我们看一下Java 中的 MouseListener 接口,它允许您跟踪某些事件,例如鼠标点击。该接口声明了五个方法:

void mouseClicked(MouseEvent e);
void mouseEntered(MouseEvent e);
void mouseExited(MouseEvent e);
void mousePressed(MouseEvent e);
void mouseReleased(MouseEvent e);

UI 元素,如按钮、文本字段等(抽象类 Component 的子类)允许您MouseListener使用方法注册 s addMouseListener

该类Component可能包含用于检测鼠标在某个区域内移动以及在该区域内按下或释放鼠标按钮的代码。现在的所有子类都Component将从该行为中受益,并且不必自己实现这一点。

现在你可以用鼠标事件做很多事情。您可能想根据鼠标位置更改某物的颜色,您可能想根据鼠标点击显示或隐藏某物,...。您可以用鼠标事件做的事情的列表是无限的。那么在一种特殊情况下应该如何Component知道想做什么呢?

但是由于您知道要对给定的鼠标事件执行什么操作Component,因此它允许您注册一个MouseListener它将在上述事件发生时调用的。而且由于您实施了,MouseListener您可以做任何您想做的事情......

在这个特定的示例中,接口非常灵活。因为即使你想对某些鼠标事件做一些不同的事情,你也不必改变Component类。你必须改变你的MouseListener,当然。但是Component对于您可能想要对鼠标事件执行的所有可能操作, 的实现保持不变。

希望那有所帮助...


更新

也许“问题”是在某些语言(如 Java、C#、C++)中,您必须在编译时提供类型信息,以便编译器知道给定对象存在哪些方法。

来自维基百科

缺乏类型推断的静态类型语言(例如 C 和 Java)要求程序员声明他们打算使用的方法或函数的类型。这可以作为程序的附加文档 [...]

所以我认为可以用yes来回答你的问题,接口和抽象方法用于确保开发人员在他们的类中包含这些方法,但这仅仅是因为在上述语言中,编译器没有其他方法来确定方法是否存在。

但是由于我在上面试图解释的原因,人们也可以不回答你的问题。

艰难的一个……

于 2013-08-02T09:52:29.787 回答
0

我找到了一个答案,可以满足我理解工作团队中接口使用的需要。

我觉得在项目中使用它是为了确保开发人员不会编写名称相似的方法并造成混淆。阅读Bruce Eckel 的“Thinking in Java”第二版中的第 8 章:接口和内部类

我认为接口不是绝对必要的仍然是正确的。但是可以说关于 OOP,我可以用一百万种不同的方式编写 Java。虽然,我选择使用 OOP 来减少头痛。但是,如果我正在处理其他人的代码,我可以使用该接口找出在类似类中可以找到哪些其他方法,甚至创建需要创建的方法......等等

这是书中的一个例子:

// Interfaces.
import java.util.*;
interface Instrument {
// Compile-time constant:
int i = 5; // static & final
// Cannot have method definitions:
void play(); // Automatically public
String what();
void adjust();
}

class Wind implements Instrument {
public void play() {
System.out.println("Wind.play()");
}
public String what() { return "Wind"; }
public void adjust() {}
}

class Percussion implements Instrument {
public void play() {
System.out.println("Percussion.play()");
}
public String what() { return "Percussion"; }
public void adjust() {}
}

class Stringed implements Instrument {
public void play() {
System.out.println("Stringed.play()");
}
public String what() { return "Stringed"; }
public void adjust() {}
}
于 2013-08-05T13:29:56.200 回答