我有两个接口,但它们具有相同的方法,具有不同的返回值,例如float
和double
。如何在类中实现它们,但不能更改方法名称?
//Calculate.java
public interface Calculate {
final float PI = 3.141592f;
float getCircumference(float r);
float getArea(float r);
}
interface GeometryShape{
public static final float PI = 3.14159f;
public abstract float getCircumference(float r);
public abstract double getArea(float r);
public abstract void draw();
}
//Circ.java
public class Circ implements Calculate, GeometryShape{
public float getCircumference(float r){
return Calculate.PI * 2 * r;
}
public float getArea(float r){
return Calculate.PI * r * r;
}
答案 0 :(得分:2)
答案 1 :(得分:0)
Elliot Frisch描述的是真实的;只允许一种方法具有该特定方法签名。方法签名由其方法名称及其形式参数描述 - 返回类型,可见性,无论是否static
- 都无关紧要。
但是,我会更容易说这两个界面实际上是相同的,只有一个真正需要存在。
在实施API时,您可以将其视为实施者必须遵循的真实合同,以及 实施方式的细节并不重要。为此,我实际上假设GeometryShape
可以被视为所有几何形状的基础,而这恰好适合作为抽象类。
从那里,界面将失去常量声明,并可能变成形容词(Calculable
,因为所有GeometricShapes
都是Calculable
)。那么你只有一个地方可以处理签名不匹配。
这是一个样本。
interface Calculable {
float getCircumference(float r);
float getArea(float r);
}
abstract class GeometryShape implements Calculable {
public static final float PI = 3.14159f;
public abstract float getCircumference(float r);
public abstract float getArea(float r);
public abstract void draw();
}
我把剩下的作为练习留给读者。
答案 2 :(得分:0)
添加我的两分钱:你可以实现两个接口定义具有相同签名的方法,只有当两者的行为相同时:因为只有一个方法对两个接口都实现了,两者的处理方式相同。
interface IName {
int getID();
String getName();
}
interface IValue {
int getID();
String getValue();
}
class Data implements IName, IValue {
int id;
String name, value;
@Override
public int getID() { // Obviously the same behaviour is expected for IName and IValue
return id;
}
@Override
public String getName() {
return name;
}
@Override
public String getValue() {
return value;
}
}
但是你无法区分这两个接口的实现(尽管在未来的Java版本(public int IName.getID()
?)会很好,因为有时你必须实现的接口不受你的控制)。