Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';当我的操作不是';所有实现者都不支持吗?_Java_Class_Interface_Methods_Implementation - Fatal编程技术网

Java 什么';当我的操作不是';所有实现者都不支持吗?

Java 什么';当我的操作不是';所有实现者都不支持吗?,java,class,interface,methods,implementation,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 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
告诉我添加未实现的方法,因为
secondMethod
没有实现,好的,我会这样做。但问题是我在
MyClass1
中不需要这个方法

你认为什么是最好的选择

  • 添加未实现的方法,例如
    返回0
  • 如果我不想实现它,还有另一种方法可以解决这个问题

  • 如果您在接口中仍然需要它,并且它永远不应该被调用(在该实现中),我将实现使它抛出一个:


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

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

    也许你不应该使用这个界面,考虑改变设计。
  • 添加存根方法(正如您所做的那样)

  • 不,没有办法,因为您实现了接口(其中包含所有方法)。仅仅实现一种方法是无效的。这将中断polimorphism

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

  • 将界面拆分为更小的部分,并根据需要进行组合。这是首选方法,尤其是当您控制
    MyInterface

  • 返回最合理的默认值。

  • 抛出一个
    不支持的操作异常


  • 这里有一个更具说明性的例子。假设您的界面如下所示:

    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 { ... }
    
    这是最好的方法,因为它完全按照需要跨接口划分职责

    如果在您的领域中,所有驾驶人都必须拥有车辆识别号,而这只是车辆识别号未知或不可用的特殊情况,那么您可以提供默认实现:

    public String getVehicleIdentificationNumber() {
      return "";
    }
    
    如果在您的域中返回车辆识别号是错误的,那么您应该抛出一个异常:

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

    您正在创建一个类,该类向任何调用方承诺它将完成MyInterface提供的所有功能

    如果你不能履行这一承诺,那么设计就存在根本性的问题

    将自己置于调用方的位置:他们将如何处理来自secondMethod()的答案?最有可能的情况是,您可以返回一个合理的值,例如0或1


    重要的是不要让调用方感到惊讶,因此我反对抛出NotImplementedException。

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

  • 如果您觉得某些类可能需要某些方法,而其他类可能不需要,那么您可能可以使用抽象类模型,在该模型中,您可以扩展并提供类所需的实现
  • 基本上,你必须接受能在更大程度上解决你的目标的电话


    例如:如果您正在实现的10个方法中有9个,那么更好的方法可能是只使用返回0来实现

    如果在MyClass1中不需要它,那么它不会实现接口,或者接口应该是两个不同的接口?@RMT-谢谢。但我认为这只是一种解决方法(有时必须做),而不是一个最优的解决方案。如果一个操作可能被支持或不被支持,一个接口通常应该有一个成员,其目的是说它是否被支持(或标识支持哪些操作)。至于是否最好将接口上的规范从“Can do XX”放宽到“Can do XX if member YY return true”,或者是否最好拆分接口,这两种方法都有优势。拆分接口意味着获得编译时支持,以确认接口可以满足需要。另一方面……如果实现接口的对象的使用者可能有一个混合的对象集合,其中一些做XX,一些不做XX,并且可能希望对那些可以处理它的对象做XX(跳过那些不能处理的对象),拥有一个接口可能是有利的,该接口的实现者可以为成员的不同子集提供有用的实现。@supercat IMO,这通常只适用于可能操作的数量超过少数或完全不同的情况。(但是,如果你的接口是异构的,你可能会想知道你是否有一种或两种代码的味道潜伏在你的周围。)但你是对的,这是另一种方法。
    public String getVehicleIdentificationNumber() {
      throw new UnsupportedOperationException("vehicle identification
        number not supported on boats");
    }