我有一个接口和两个正在实现接口的类。
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
中不需要这种方法。
在您看来,最好的做法是什么?
return 0
答案 0 :(得分:15)
您应该执行以下操作之一:
将界面拆分为更小的部分并根据需要进行撰写。这是首选方法,尤其是在您控制MyInterface
时。
返回最明智的默认值。
投掷UnsupportedOperationException
。
这是一个更具说明性的例子。假设您的界面如下所示:
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)
如果您有不相关的方法:
答案 3 :(得分:1)
这取决于要求。 1. 接口模式在实现接口的每个其他类具有几乎相同的行为时非常有用,这解释了为什么所有方法实现都是必需的。
基本上你必须接受更大程度上解决你目的的电话。
对于Ex:如果你正在实现的10个方法中有9个,那么可能更好的想法就是用return 0来实现。
答案 4 :(得分:0)
要实现这一点,您必须使用抽象父类,而不是接口(可能不是您想要的接口)。
答案 5 :(得分:0)
通常在这些情况下,您创建一个基类,它提供所有接口方法的空实现,并从中扩展。例如,请查看MouseAdapter
答案 6 :(得分:0)
没有办法,因为你实现了接口(里面有所有方法)。它只能实现一种方法是无效的。这将打破民族主义
答案 7 :(得分:0)
你正在创建一个承诺任何调用者的类,它将完成MyInterface提供的所有功能。
如果你不能履行这一承诺,那么设计根本就会出现问题。
让自己处于调用者的位置:他们将如何处理来自secondMethod()的回答?很可能它有一个合理的值,如0或1,你可以返回。
重要的是你不要让你的调用者感到惊讶,所以我反对抛出一个NotImplementedException。