这个问题不清楚,但我想知道你是否发明了“依赖注入”?
难题的第一部分是,是的,一个方法可以返回多个值,方法是将它们包装在一个对象中。
public class ValuePair {
public int a;
public int b;
}
public ValuePair takeInput(){
ValuePair pair = new ValuePair();
println("Enter a number: (a) and (b)\n");
pair.a = readInt("a:");
pair.b = readInt("b:");
return pair;
}
你可以这样做:
ValuePair p = takeInput();
System.out.println("Hypotenuse is " + calculateHypotenuse(p.a, p.b) + "\n";
(请注意,公共字段通常不被认为是好的样式 - 我在这里使用它们是因为代码更短。在实际代码中使用 getter 和 setter)。
这可能就是您需要的全部答案。但你问:
有没有办法可以将这些方法传递给另一种方法?
好吧,是的,如果您将该方法包装在专用于该目的的类中,则可以。出于我希望显而易见的原因,我们将首先定义一个接口。
public interface ValuePairSource {
public ValuePair getPair();
}
...以及实现它的类:
public class UserInputValuePairSource implements ValuePairSource {
@Override
public ValuePair getPair() {
ValuePair pair = new ValuePair();
println("Enter a number: (a) and (b)\n");
pair.a = readInt("a:");
pair.b = readInt("b:");
return pair;
}
}
现在您可以创建一个 Pythagoras 类,该类可以被告知从何处获取其值。
public class Pythagoras {
private ValuePairSource valuePairSource;
public Pythagoras(ValuePairSource source) {
this.valuePairSource = source;
}
public double hypotenuse() {
ValuePair pair = valuePairSource.getPair();
return Math.sqrt(pair.a ^ 2 + pair.b ^ 2)
}
}
在构造函数中,我们告诉我们创建的每个毕达哥拉斯对象,如何获取一对值。所以我们可以这样使用它:
Pythagoras p = new Pythagoras(new UserInputValuePairSource());
double hypotenuse = p.hypotenuse();
这有什么用?嗯,这意味着我们可以发明其他类型的 ValuePairSource。例如,一个 ShapeValuePairSource,它从我们设置的 Shape 对象中获取值。
(这些是出于问题目的的假设类)
所以你可以像这样使用它:
Triangle t = canvas.getLastTriangle(); // or whatever
ValuePairSource vps = new ShapeValuePairSource(triangle);
Pythagoras p = new Pythagoras(vps);
double hypotenuse = p.hypotenuse();
因此,在完全不改变 Pythagoras 类的情况下,我们现在让它从形状对象中读取值,而不是用户输入。
好的,这是一个人为的例子,但它确实回答了“我可以将这些方法传递给另一个方法”的问题——这是 Spring 之类的基础。
请注意,某些语言允许您将方法直接传递给其他方法,而无需像我们在这里那样将它们包装在一个类中。这称为“函数式编程”,通常将“方法”称为“函数”。