为什么dart不允许方法重载?

时间:2020-06-28 18:48:22

标签: dart

我尝试在某些dart代码中使用方法重载,并很快了解到dart中不提供重载。

我的问题是:为什么不提供它,推荐的替代方法是什么?是否存在标准的命名约定,因为执行相同操作但具有不同输入的方法必须具有不同的名称?

使用命名参数然后检查调用方是否已提供足够的信息来完成计算是否正常?

说我有一种方法,可以返回某人一年的收入,称为$messagesPerPage = 10; $messagePosition = array_search($message->id, $topic->messages->pluck('id')->toArray()) + 1; // <-- this would fry my CPU and RAM :') $guessedPageOfMessage = ceil($messagePosition / $messagesPerPage); // ... <a href="{{ route('topics.show', ['topic' => $topic->id, 'page' => $guessedPageOfMessage]) }}">view my message in topic {{ $topic->title }}</a>

在Java中,我将创建这样的方法

yearlyIncome

也许还有另一种这样的方法

double yearlyIncome(double hourlyRate, double hoursWorkedPerYear)

,依此类推。它们都用于计算相同的事物,但是具有不同的输入。用dart做到这一点的最佳标准化方法是什么?

非常感谢。

2 个答案:

答案 0 :(得分:1)

Dart完全不支持函数重载。 函数重载需要静态类型。 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');

可选参数也可以具有默认值。可选的已命名和未命名参数不能一起使用(单个功能只能使用一个或另一个) 对于构造函数,您可以使用命名构造函数作为替代

答案 1 :(得分:0)

Dart最初不支持重载,因为它是一种动态性更强的语言,其中声明的类型没有任何语义影响。这使得不可能使用基于静态类型的重载解析。

此后,Dart已更改为更具静态性的类型,并且从根本上来讲,今天没有什么东西可以阻止Dart添加重载,除了这将是一项巨大的工作,而且是对该语言的巨大改变。大概我想,因为没有任何明显的设计既不是高度复杂也不是巨大破坏。

在Dart中要做的是使用可选参数。像这样的方法:

String toString([int radix]);

有效地具有两个签名:String Function()String Function(int)。它可以同时作用于两个签名。 仅对可选参数可以使用的范围有一定的限制,因为它们仍需要每个参数只有一种类型,但这是Dart当前提供的替代方法。 (或者使用其他名称,但这不是重载,您也可以在具有重载的语言中执行此操作。)

如果我们想在Dart语言中添加重载,则可选参数也是复杂性之一-具有可选参数的现有函数是否会算作多个重载?如果您声明类似的类:

abstract class WithOverloading {
  String toString();
  String toString(int radix);
}

然后是与以下相同的签名:

abstract class WithoutOverloading {
  String toString([int radix]);
}

可能不是,因为您可以拆分后者并使用可选参数获取一个函数,并且可能无法从前者和将它们组合为一个功能。也许您可以,这就是为什么如何将重载包含到现有Dart语言中并不是一个简单的设计问题。