在我从头开始构建的所有新应用程序中,我从未见过对界面的需求,我过去在文本中读过,后来被忽略并忘记了真正的需求。
那就是说,这是我过去曾经问过的一个问题,我会用这个例子来问这个问题......
假设我有这个界面:
public interface IBox
{
public void setSize(int size);
public int getSize();
public int getArea();
//...and so on
}
我有一个实现它的类:
public class Rectangle implements IBox
{
private int size;
//Methods here
}
使用如下:
public static void main(String args[])
{
Rectangle myBox=new Rectangle();
// do stuff.
System.out.println( myBox.getSize() );
}
鉴于我仍然需要在Rectangle类中编写setSize getSize getArea方法。 假设使用这些方法的Rectangle,即使没有IBox接口,它仍然可以工作。
除了宣传或指示或描述setSize getSize getArea方法之外,拥有Ibox接口有什么意义?
答案 0 :(得分:2)
好吧,我们先不要直接回答。假设我们有一个静态方法scaleBox()
,它采用一个框并对其进行缩放。显然HexagonalBox
不会延长Rectangle
。我们需要scaleBox(HexagonalBox h)
和scaleBox(Rectangle r)
。我们可以让这两个框都实现IBox
并使用一个方法scaleBox(IBox box)
。该方法保证为setSize()
。
由于接口是一个类型,你可以有许多不相互扩展的类实现该接口,并安全地传递(因为它们保证遵守接受接口作为参数时所期望的合同)
在明年JDK 8的相关说明中,您需要专门设计的接口才能在新版本中使用lambda功能。 子>
答案 1 :(得分:1)
你的榜样很好。你遗漏的是如果你想让你的代码与其他类型的盒子一起工作会发生什么。如果您使用Rectangle
的硬编码,则几乎不可能添加其他规范,例如Square
(假设Square
足够专门用于拥有自己的实现)。想一想以下内容:
public void DoSomethingWithBox(Rectangle box)
{
// Do something with the box.
}
现在,如果你愿意的话,你必须写一个重载来取一个正方形。或者,您可以简单地让Rectangle
和Square
实现接口,这意味着您可以将单个方法更改为:
public void DoSomethingWithBox(IBox box)
{
// Do something with the box.
}
现在可以通过任何实现IBox
接口的方式来调用它。