What is the point of a Java interface?
在我从零开始构建的所有新应用程序中,我从未见过需要接口,我以前读过文本,后来忽略并忘记了真正的需求。
也就是说,这里有一个我以前见过的问题,我将用这个问题来举例…
假设我有这个接口:
1 2 3 4 5 6 7
| public interface IBox
{
public void setSize(int size);
public int getSize();
public int getArea();
//...and so on
} |
我有一个实现它的类:
1 2 3 4 5
| public class Rectangle implements IBox
{
private int size ;
//Methods here
} |
使用方法如下:
假设我仍然需要在Rectangle类中编写setSize GetSize GetArea方法。考虑到使用这些方法的矩形,即使没有IBox接口也可以工作。
除了公开、命令或描述setSize getSize getArea方法之外,拥有IBox接口还有什么意义?
- 好吧,接口支持所谓的多态性
- 这个问题加起来就是"接口有什么用?"stackoverflow.com/questions/383947/…
- 谷歌搜索会产生数百万次点击量
- 对于这个问题,无论是在SO上还是在一般的互联网上,都有很多很好的资源。谷歌是你的朋友。
- 我理解投票结束,但为什么是落选?这不是一个直观的问题,第一次接触对象可能会令人困惑。
- 谢谢戴夫。这个链接是我见过的最好的例子。与人们普遍认为的相反,我以前研究过这个问题。我现在明白了为什么要使用接口(只花了十年时间)。如果我有足够的代表点,我会给你和上面链接中的作者一个+1。
- 我同意弗兰克的看法。当然,谷歌会创造一百万的点击量。问题是,它基本上是相同的片段/解释被反复复制和重复。没有人对这个问题真正给出不同或新的解释。如果你不理解第一个解释,你甚至不需要为其他999999烦恼,因为它们没有添加任何新的内容。人们可能不同意我的看法,但这是他们在实践中的看法。界面是一个难以理解的概念,这似乎是一个常见的现象。
好吧,我们不要直接回答。假设我们有一个静态方法scaleBox(),它接受一个盒子并缩放它。显然,HexagonalBox不会延长Rectangle。我们需要一个scaleBox(HexagonalBox h)和一个scaleBox(Rectangle r)。我们可以让这两个框实现IBox,并有一个方法,scaleBox(IBox box)。该方法保证为setSize()。
由于接口是一种类型,所以可以有许多类不相互扩展来实现该接口,并且可以安全地传递(因为它们保证遵守接受接口作为参数时所期望的约定)。
关于明年JDK8的相关注释,您将需要专门设计的接口,以便在新版本中使用lambda特性。
你的例子很好。如果您希望代码与其他类型的框一起工作,那么您所遗漏的就是可能发生的事情。如果您硬编码Rectangle,那么几乎不可能添加其他规范,如Square(假设Square)足够专门化,可以自己实现)。请考虑以下几点:
1 2 3 4
| public void DoSomethingWithBox (Rectangle box )
{
// Do something with the box.
} |
现在,如果你想要一个正方形的话,你必须写一个超负荷的东西。或者,您可以简单地让Rectangle和Square实现接口,这意味着您可以将单个方法更改为:
1 2 3 4
| public void DoSomethingWithBox(IBox box)
{
// Do something with the box.
} |
它现在可以被任何实现你的IBox接口的东西调用。