3 回答
TA贡献1836条经验 获得超4个赞
假设每个版本都anOtherFunction接受两个整数并返回一个整数,我只会让该方法接受一个函数作为参数,使其成为高阶。
接受两个相同类型参数并返回相同类型对象的函数称为 a BinaryOperator。您可以向方法中添加该类型的参数以传递函数:
// Give the method an operator argument
public void doSomething(BinaryOperator<Integer> otherMethod) {
int a = 6;
int b = 7;
// Then use it here basically like before
// "apply" is needed to call the passed function
int c = otherMethod.apply(a,b);
while(c < 50)
c++;
}
}
您如何使用它取决于您的用例。作为使用 lambda 的一个简单示例,您现在可以这样称呼它:
doSomething((a, b) -> a + b);
它只是返回的总和a及b。
但是,对于您的特定情况,您可能会发现将其doSomething作为接口的一部分并不是必需的或最佳的。如果相反,anOtherMethod需要提供什么?不要期望您的类提供 a doSomething,而是让它们提供 a BinaryOperator<Integer>。然后,当您需要从 获取结果时doSomething,从类中获取运算符,然后将其传递给doSomething。就像是:
public callDoSomething(HasOperator obj) {
// There may be a better way than having a "HasOperator" interface
// This is just an example though
BinaryOperator<Integer> f = obj.getOperator();
doSomething(f);
}
TA贡献1900条经验 获得超5个赞
这看起来是模板方法模式的一个很好的例子。
放入
doSomething
一个基类。abstract protected anotherMethod
也在该基类中声明,但不提供实现。然后每个子类为 提供正确的实现
anotherMethod
。
TA贡献1828条经验 获得超3个赞
这就是您如何实现 Thilo 在以下演示中谈到的技术:
主要类:
public class Main extends Method {
public static void main(String[] args) {
Method m = new Main();
m.doSomething();
}
@Override
public int anOtherMethod(int a, int b) {
return a + b;
}
}
抽象类:
public abstract class Method {
public abstract int anOtherMethod(int a, int b);
public void doSomething() {
int a = 6;
int b = 7;
int c = anOtherMethod(a, b);
System.out.println("Output: "+c);
}
}
这样,您所要做的就是anOtherMethod()在要使用doSomething()方法的不同实现的每个类中进行覆盖anOtherMethod()。
添加回答
举报