以下代码:
class Tools {
static int roll(int min, int max) {
// IMPLEMENTATION
}
static int roll(List<int> pair) {
// IMPLEMENTATION
}
}
Run Code Online (Sandbox Code Playgroud)
The name 'roll' is already defined在第二个roll函数上呈现错误.
怎么会?由于函数的参数是不同的,不应该应用多态?
编辑.更正标题以更好地反映主题.
Gün*_*uer 30
您的代码演示的是函数重载,与多态无关.
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');
Run Code Online (Sandbox Code Playgroud)
可选参数也可以具有默认值.可选的命名和未命名参数不能用于(单个函数只有一个或另一个)
多态和静态方法:
静态方法只能在没有类名作为前缀的情况下从定义它们的类中进行访问.从子类调用时,需要将超类的名称用作前缀.
好吧,这已经很老了。但这是一种可以在未来帮助某人的方法。非常依赖泛型,所以为了感知美,你应该非常熟悉这个概念。
这是一个非常无用和荒谬的例子:
// 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;
}
Run Code Online (Sandbox Code Playgroud)
函数的用法是这样的:
roll(FromMinAndMax()
..min = 0
..max = 100
);
roll(FromList()
..pair = [0, 200]
);
Run Code Online (Sandbox Code Playgroud)
这种方法的主要缺点是您无法控制参数是否可选。
也许你会认为函数的重载名称在派生类型中,太冗长了。但是,如果您正确实现并在某些情况下提高可读性,则可以重用一些代码。
无论如何,这只是实现函数重载的另一种方式,针对不同情况还有更多方式。
| 归档时间: |
|
| 查看次数: |
5866 次 |
| 最近记录: |