当我的操作没有得到所有实施者的支持时,设计界面的正确方法是什么?

时间:2011-07-27 11:30:03

标签: java class interface methods implementation

我有一个接口和两个正在实现接口的类。

public interface MyInterface {
    public void firstMethod();  
    public int secondMethod();
}

public class MyClass1 implements MyInterface  {
    public void firstMethod() {}
}

public class MyClass2 implements MyInterface  {
    public void firstMethod() {}
    public int secondMethod() {}
}

班级MyClass1告诉我Add unimplemented methods,因为secondMethod没有实施,好的我会这样做。但问题是我在MyClass1中不需要这种方法。

在您看来,最好的做法是什么?

  1. 使用return 0
  2. 之类的内容添加未实现的方法
  3. 如果我不想实现它,还有另一种方法可以解决这个问题。

8 个答案:

答案 0 :(得分:15)

您应该执行以下操作之一:

  1. 将界面拆分为更小的部分并根据需要进行撰写。这是首选方法,尤其是在您控制MyInterface时。

  2. 返回最明智的默认值。

  3. 投掷UnsupportedOperationException


  4. 这是一个更具说明性的例子。假设您的界面如下所示:

    public interface Driveable {
      public Position accelerate(Vector v, Time t);
      public String getVehicleIdentificationNumber();
    }
    

    如果您的MyClass1实际上是Boat并且没有车辆识别码,那么您实施此功能是没有意义的。事实上,这实际上是错误的。其他客户希望您拥有此值,但您无法将其提供给他们。

    最好将块并将接口组合成更小的块,并根据需要使用正确的切片。例如,您可以改为写下:

    public interface Driveable {
      public Position accelerate(Vector v, Time t);
    }
    
    public interface Vehicle extends Driveable {
      public String getVehicleIdentificationNumber();
    }
    
    public class Boat implements Driveable { ... }
    public class Car implements Vehicle { ... }
    

    这是最好的方法,因为它可以根据需要在界面中完全分割责任。

    如果您的域中确实 非常重要,所有Driveables都有车辆识别号码,这只是车辆识别号码未知或不可用的特殊情况,那么您可以提供默认实现:

    public String getVehicleIdentificationNumber() {
      return "";
    }
    

    如果您所在的域中根本没有返回车辆识别码,那么您应该抛出异常:

    public String getVehicleIdentificationNumber() {
      throw new UnsupportedOperationException("vehicle identification
        number not supported on boats");
    }
    

答案 1 :(得分:2)

如果你仍然需要它在接口中,它永远不应该被调用(在该实现中)我会实现make它抛出UnsupportedOperationException

public int secondMethod() {
    throw new UnsupportedOperationException("Should not be called!");
}

答案 2 :(得分:2)

如果您有不相关的方法:

  1. 也许您不应该使用此界面,请考虑更改设计。
  2. 添加存根方法(就像你一样)。

答案 3 :(得分:1)

这取决于要求。 1. 接口模式在实现接口的每个其他类具有几乎相同的行为时非常有用,这解释了为什么所有方法实现都是必需的。

  1. 如果您认为某些课程可能需要某些方法而其他方法可能不需要,可能您可以使用抽象类模型,您可以在其中扩展并提供您的课程所需的实现。
  2. 基本上你必须接受更大程度上解决你目的的电话。

    对于Ex:如果你正在实现的10个方法中有9个,那么可能更好的想法就是用return 0来实现。

答案 4 :(得分:0)

要实现这一点,您必须使用抽象父类,而不是接口(可能不是您想要的接口)。

答案 5 :(得分:0)

通常在这些情况下,您创建一个基类,它提供所有接口方法的空实现,并从中扩展。例如,请查看MouseAdapter

答案 6 :(得分:0)

没有办法,因为你实现了接口(里面有所有方法)。它只能实现一种方法是无效的。这将打破民族主义

答案 7 :(得分:0)

你正在创建一个承诺任何调用者的类,它将完成MyInterface提供的所有功能。

如果你不能履行这一承诺,那么设计根本就会出现问题。

让自己处于调用者的位置:他们将如何处理来自secondMethod()的回答?很可能它有一个合理的值,如0或1,你可以返回。

重要的是你不要让你的调用者感到惊讶,所以我反对抛出一个NotImplementedException。