【问题标题】:Block methods in interface for users usage界面中的阻塞方法供用户使用
【发布时间】: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()方法,不同的参数(参数的数量和参数的类型)跨度>
  • 接口不应该这样使用

标签: java methods interface


【解决方案1】:

只放入多态的接口操作,并用于具有相同签名的多个实现。仅当大多数实现支持签名时才使用 UnsupportedOperationException。如果它在逻辑上是具有不同签名的相同操作,请考虑更改设计以使其对所有人都具有相同的签名,例如在构造函数或构建器对象中传递参数。

【讨论】:

  • 我认为您通过构造函数传递参数的方法有助于摆脱一些接口并将正确的参数绑定到相应的算法类。有时,如果您长时间关注代码的特定部分,您会盲目地寻找简单的解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
相关资源
最近更新 更多