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");
}