【发布时间】:2016-11-02 17:41:37
【问题描述】:
有没有一种优雅的方式来为具有(单个)动态调度的 OO 语言中具有 2 个(甚至更多)参数的方法获得多个调度?
可能的问题示例:
这是一个受 Java 启发的示例。(问题与语言无关!)
// Visitable elements
abstract class Operand {
}
class Integer extends Operand {
int value;
public int getValue() {
return value;
}
}
class Matrix extends Operand {
int[][] value;
public int[][] getValue() {
return value;
}
}
// Visitors
abstract class Operator {
// Binary operator
public Operand eval(Operand a, Operand b) {
return null; // unknown operation
}
}
class Addition extends Operator {
public Operand eval(Integer a, Integer b) {
return new Integer(a.getValue() + b.getValue());
}
}
class Multiplication extends Operator {
public Operand eval(Integer a, Integer b) {
return new Integer(a.getValue() * b.getValue());
}
// you can multiply an integer with a matrix
public Operand eval(Integer a, Matrix b) {
return new Matrix();
}
}
我有很多 Operator 和 Operand 的具体类型,但只能通过它们的抽象类型来引用它们:
Operand a = new Integer()
Operand b = new Matrix();
Operand result;
Operator mul = new Multiplication();
result = mul.eval(a, b); // Here I want Multiplication::eval(Integer, Matrix) to be called
【问题讨论】:
-
你的例子是否可以编译? (数字到操作数的转换)。你能澄清一下问题是什么吗?现在还不清楚您在寻找什么
-
我没有写构造函数所以它不能编译,这只是一个例子。当被调用的对象具有静态类型运算符和运行时类型乘法并且其参数具有静态类型操作数和运行时类型整数和矩阵时,我想要调用 Multiplication::eval(Integer, Matrix)。为此存在一种模式,当 eval 方法只有一个参数时,称为多重分派。对于 2 个(或更多)参数,我想要相同的参数。
-
一旦你定义了
Operator mul;,你就受限于Operator定义的合约。因此,除非您在Operator类(或其父类之一)中定义eval(Integer, Matrix)方法,否则您将无法调用它。您可以将其更改为Multiplication,而不是将其声明为Operator类型。
标签: java oop dynamic parameter-passing dispatch