【发布时间】:2020-05-17 13:50:24
【问题描述】:
想象一下,我想创建以下(简化的)结构:
public interface IAlgorithm {
public int execute(int input);
public int execute(int input, int input2);
public int execute(int input, int input2, double input3);
// Further execute(...)-definitions
}
我们有不同的类,它们实现了这个接口:
public class CalcSquare implements IAlgorithm {
public int execute(int input) {
return input * input;
}
public int execute(int input, int input2) { return -1; }
public int execute(int input, int input2, double input3) { return -1; }
}
public class CalcMultiplication implements IAlgorithm {
public int execute(int input) { return -1; }
public int execute(int input, int input2) {
return input * input2;
}
public int execute(int input, int input2, double input3) { return -1; }
}
public class CalcWith3Parameters implements IAlgorithm {
public int execute(int input) { return -1; }
public int execute(int input, int input2) { return -1; }
public int execute(int input, int input2, double input3) { return doSomething(input, input2, input3); }
}
换句话说:接口定义了一种具有不同参数组合的方法。如果用户想要实例化一个特定的类,例如CalcMultiplication,他可以这样做:
public static void main(String[] args) {
IAlgorithm mult = new CalcMultiplication();
int result m = mult.execute(1, 2);
}
现在,在 IDE(例如 Eclipse)中,我们可以在“mult”之后按 Ctrl 和 Space。显示对象“mult”的可能性。它将显示所有 3 个 execute()-Methods,即使其中两个对这个类也没有意义。
在“CalcSquare”显示第二种和第三种方法是没有意义的。 在“CalcMultiplication”中显示第一种和第三种方法是没有意义的。 在“CalcWith3Parameters”中显示第一种和第二种方法是没有意义的。
我的问题:有没有可能,例如通过注释,在这三个类中“阻止”不是“允许”的方法,而是使用一个相同的 IAlgorithm 接口来处理不同的“IAlgorithm”对象?用户应该只在具体实例化对象上看到一组特定的 execute() 方法。我想避免三个不同的接口,只有一个 execute()-definition。
谢谢 亚历克斯
【问题讨论】:
-
一开始我能想到的最好办法是抛出 UnsupportedOperationException,尽管在这种情况下仍然可以调用方法
-
而且我认为你如何使用多态性存在问题。据我了解,您希望在接口中有一组常用方法,这些方法将根据实现做不同的事情。虽然实际上不同的实现应该以不同的方式做同样的事情。
-
嗯,当然上面的算法不一样,每个算法应该是不同的,因此我需要不同的execute()方法,不同的参数(参数的数量和参数的类型)跨度>
-
接口不应该这样使用