应该如何使用接口和抽象方法?

时间:2013-08-02 09:22:22

标签: oop interface abstract-methods

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

这也可以通过使用流程来实现吗?例如测试驱动的开发。

似乎不灵活。代码更改时会发生什么?

我很难理解这些限制的必要性。
为什么在将来有可能做更多工作的情况下,甚至在代码中添加一个接口?

2 个答案:

答案 0 :(得分:0)

您通常使用接口或抽象类来将两个具体类彼此分离。

让我们看一下MouseListener interface in Java,它可以让您跟踪鼠标点击等特定事件。该接口声明了五种方法:

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

按钮,文本字段等UI元素(the abstract class Component的子类)允许您使用MouseListener方法注册addMouseListener

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

现在你可以用鼠标事件做很多事情。您可能希望根据鼠标位置更改某些内容的颜色,您可能希望基于鼠标单击显示或隐藏某些内容,......您可以使用鼠标事件执行无限的列表。那么Component应该如何知道想要在某个特定情况下做什么?

但是既然你知道你想对给定Component的鼠标事件做什么,它允许你注册一个MouseListener,当上述事件发生时它会调用它。自从你实施MouseListener后,你可以做任何你想要的事情......

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

希望有所帮助...


更新

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

来自Wikipedia

  

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

的附加文档

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

但是我也可以用 no 回答你的问题,原因我上面试过解释。

艰难的一个......

答案 1 :(得分:0)

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

我觉得它在项目中用于确保开发人员不会编写具有相似名称的方法并造成混淆。 阅读第8章:接口&来自“Thinking in Java”的内部课程第二版由Bruce Eckel撰写

我认为接口并非绝对必要。 但可以说是关于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() {}
}