关于实现接口方法的困惑

时间:2010-02-19 07:38:37

标签: java interface

HI 我有一个问题如果接口有四个方法,我只想实现两个方法,如何实现呢?

任何解释都是可能的,或者我应该去实施所有方法。

7 个答案:

答案 0 :(得分:4)

如果不声明实现类抽象,则不能“部分”实现接口,因此需要某些子类提供剩余的实现。原因是接口是契约,实现它声明“我提供接口指定的行为”。其他一些代码将通过声明的接口使用您的类,并期望这些方法存在。

如果您知道用例不使用其他两种方法,则可以通过抛出OperationNotSupported来实现它们。这是否有效取决于接口和用户。如果接口可以通过这种方式合法地部分实现,那么接口设计不良并且可能应该是两个接口的代码气味。

你也可以通过什么都不做来“实现”接口,尽管这通常只适用于“监听器”或“回调”实现。

简而言之,一切都取决于。

答案 1 :(得分:2)

您可以创建实现类abstract并从接口实现4种方法中的两种。

答案 2 :(得分:2)

如果您控制界面的设计,只需将其分成两部分即可。一个接口指定两个只有一些实现实现,一个接口指定另外两个(或继承前两个并添加更多,您的选择)

答案 3 :(得分:2)

我认为@sateesh的回答是更接近解决问题的答案。让我详细说明一下。首先,任何实现接口的类都必须提供所有方法的定义。但在某些情况下,用户可能会发现界面中的大多数方法没有用,除了一两个。考虑以下具有6种抽象方法的接口:

  public interface HugeInterface {
     void a();
     void b();
     void c();
     void d();
     void e();
     void f();
    }

假设您的代码仅用于方法'c()',并且您希望仅为方法'c()'提供实现细节。您可以在单独的文件中创建一个新类HugeInterfaceAdapter,该文件实现接口HugeInterface的所有方法,如下所示:

    public class HugeInterfaceAdapter implements HugeInterface {
     public void a() {}
     public void b() {}
     public void c() {}
     public void d() {}
     public void e() {}
     public void f() {}
    }

请注意,您无需为任何方法提供任何实际的实现代码。现在是有趣的部分。是的,你的课程首先需要实现一个巨大的界面。

public class MyClass {
 HugeInterfaceAdapter mySmallInterface = new HugeInterfaceAdapter() {
  @Override
  public void c() {
   //Your class-specific interface implementation code here.
  }
 };
}

现在,您可以在期望mySmallInterface的所有地方使用引用变量HugeInterface。这可能看起来有点像hackish,但我可以说它是由Java正式认可的,像MouseAdapter这样的类证明了这一事实。

答案 4 :(得分:1)

这是不可能的。

您可以实现所有四种方法,但是您不需要的两种方法应该抛出UnsupportedOperationException

答案 5 :(得分:0)

如果你想要一个实现这个接口的具体类,那么就不可能有未实现的方法,但如果你有实现这个接口的抽象类,那么你可以保留任意数量的方法,因为你想要实现它们。

答案 6 :(得分:0)

正如其他答案所提到的,你不能拥有一个具体的类,只实现它实现的接口的一些方法。如果您无法控制类扩展的接口,您可以考虑使用Adapter类。 抽象Adapter类可以为接口的方法提供虚拟实现,客户端类可以 扩展Adapter类。 (当然缺点是你不能扩展多个类)

这是使用事件监听器类的GUI编程(使用Swing)的常见做法 可能对实现EventListener接口指定的所有方法不感兴趣。例如 看一下java.awt.event.MouseListener接口和相应的适配器类java.awt.event.MouseAdapter