以下代码:
class Tools {
static int roll(int min, int max) {
// IMPLEMENTATION
}
static int roll(List<int> pair) {
// IMPLEMENTATION
}
}
在第二个The name 'roll' is already defined
函数上呈现roll
错误。
怎么会?由于函数的参数是不同的,不应该应用多态?
编辑。更正标题以更好地反映主题。
您的代码演示的是函数重载,与多态无关。
Dart根本不支持函数重载。
您可以为方法使用不同的名称,也可以使用可选的命名或未命名参数
// optional unnamed
void foo(int a, [String b]);
...
foo(5);
foo(5, 'bar');
// optional named
void foo(int a, {String b});
...
foo(5);
foo(5, b :'bar');
可选参数也可以具有默认值。可选的命名和未命名参数不能用于(单个函数只有一个或另一个)
多态和静态方法:
静态方法只能在没有类名作为前缀的情况下从定义它们的类中进行访问。从子类调用时,需要将超类的名称用作前缀。
好吧,这是相当古老的。但这是一种可以在将来帮助某人的方法。非常依赖于仿制药,所以为了感知美感,你应该非常熟悉这个概念。
这是一个非常无用且荒谬的例子:
// these are the overloads
class RollArguments { }
class FromMinAndMax extends RollArguments {
int min;
int max;
}
class FromList extends RollArguments {
List<int> pair;
}
// this is the function
int roll<T extends RollArguments> (T r) {
var min = 0;
var max = 0;
if (r is FromMinAndMax) {
min = r.min;
max = r.max;
}
else if (r is FromList) {
min = r.pair[0];
max = r.pair[1];
}
print("min = $min; max = $max");
return 1;
}
函数的用法是这样的:
roll(FromMinAndMax()
..min = 0
..max = 100
);
roll(FromList()
..pair = [0, 200]
);
这种方法的主要缺点是您无法控制参数是否可选。
也许您可以认为函数的重载名称在派生类型中,并且它太冗长了。但是,如果正确实现它并在某些情况下提高可读性,则可以重用一些代码。
无论如何,这只是实现函数重载的另一种方法,对于不同的情况有更多的方法。