Dart中的函数重载

Cal*_*ebe 17 overloading dart

以下代码:

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)

可选参数也可以具有默认值.可选的命名和未命名参数不能用于(单个函数只有一个或另一个)

多态和静态方法:

静态方法只能在没有类名作为前缀的情况下从定义它们的类中进行访问.从子类调用时,需要将超类的名称用作前缀.

  • Dart不支持函数重载,方法重载怎么办? (3认同)
  • 在这方面,功能和方法相同。跟随https://github.com/dart-lang/sdk/issues/26488 (2认同)
  • 最初是因为类型在 Dart 1.x 中是可选的,这会让这个功能很难实现,而且我认为 Dart 团队不认为它是一个值得在 Dart 2 中添加的功能,或者只是优先级不够高。 (2认同)

San*_*dez 7

好吧,这已经很老了。但这是一种可以在未来帮助某人的方法。非常依赖泛型,所以为了感知美,你应该非常熟悉这个概念。

这是一个非常无用和荒谬的例子:

// 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)

这种方法的主要缺点是您无法控制参数是否可选。

也许你会认为函数的重载名称在派生类型中,太冗长了。但是,如果您正确实现并在某些情况下提高可读性,则可以重用一些代码。

无论如何,这只是实现函数重载的另一种方式,针对不同情况还有更多方式。