0

在我从头开始构建的所有新应用程序中,我从未见过对界面的需求,我过去阅读过文本,随后忽略并忘记了真正的需求。

也就是说,这是我过去见过的一个问题,我将用它来举例提出这个特定的问题......

假设我有这个界面:

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 接口还有什么意义?

4

2 回答 2

2

好吧,我们先不直接回答。假设我们有一个静态方法scaleBox(),它接受一个盒子并对其进行缩放。显然HexagonalBox不会延长Rectangle。我们需要 ascaleBox(HexagonalBox h)和 a scaleBox(Rectangle r)。我们可以同时实现这两个盒子IBox并拥有一个方法,scaleBox(IBox box). 该方法保证为setSize().

由于接口是一种类型,因此您可以让许多不相互扩展的类实现该接口,并安全地传递(因为它们保证在接受接口作为参数时遵守预期的约定)

在明年 JDK 8 的相关说明中,您需要专门设计的接口才能在新版本中使用 lambda 功能。

于 2013-09-16T19:49:25.883 回答
1

你的例子很好。您遗漏的是如果您希望您的代码与其他类型的框一起使用会发生什么。如果您对 进行硬编码Rectangle,则几乎不可能添加其他规范,例如Square(假设Square足够专业,可以拥有自己的实现)。想一想:

public void DoSomethingWithBox(Rectangle box)
{
    // Do something with the box.
}

现在,如果你愿意,你必须写一个重载来取一个正方形。或者,您可以简单地同时拥有两者RectangleSquare实现接口,这意味着您可以将单个方法更改为:

public void DoSomethingWithBox(IBox box)
{
    // Do something with the box.
}

它现在可以被任何实现你的IBox接口的东西调用。

于 2013-09-16T19:48:42.397 回答