接口是否比拥有正确的方法更多

2022-08-31 07:17:30

假设我有这个接口:

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
}

如果我想使用界面IBox,我实际上无法创建它的实例,方式如下:

public static void main(String args[])
{
    Ibox myBox=new Ibox();
}

右?所以我实际上必须这样做:

public static void main(String args[])
{
    Rectangle myBox=new Rectangle();
}

如果这是真的,那么接口的唯一目的是确保实现接口的类具有接口所描述的正确方法?或者接口还有其他用途吗?


答案 1

接口是使代码更加灵活的一种方式。你所做的是这样的:

Ibox myBox=new Rectangle();

然后,稍后,如果您决定要使用不同类型的框(也许有另一个库,具有更好的框),请将代码切换到:

Ibox myBox=new OtherKindOfBox();

一旦你习惯了它,你会发现这是一种很好(实际上是必不可少的)工作方式。

另一个原因是,例如,如果要创建一个框列表并对每个框执行一些操作,但您希望该列表包含不同类型的框。在每个盒子上,你可以做:

myBox.close()

(假设 IBox 有一个 close() 方法),即使 myBox 的实际类会根据你在迭代中的哪个框而变化。


答案 2

使接口有用的不是“您可以改变主意并在以后使用不同的实现,并且只需要更改创建对象的一个地方”。。这不是问题。

真正的要点已经在名称中:他们定义了一个接口,任何人都可以实现该接口以使用在该接口上运行的所有代码。最好的例子是它提供了各种有用的方法,这些方法专门在接口上运行,例如 或 for 。这里的要点是,此代码现在可用于对实现接口的任何类进行排序或反转 - 不仅仅是 and ,还包括您自己编写的类,这些类可能以编写者从未想象过的方式实现。java.util.Collectionssort()reverse()ListListArrayListLinkedListjava.util.Collections

同样,您可以编写在已知接口或您定义的接口上运行的代码,其他人可以使用您的代码,而不必要求您支持他们的类。

接口的另一个常见用途是回调。例如,java.swing.table.TableCellRenderer,它允许您影响 Swing 表在特定列中显示数据的方式。实现该接口,将实例传递给 ,在表呈现过程中的某个时刻,您的代码将被调用来执行其操作。JTable