【问题标题】:Function overloading in DartDart 中的函数重载
【发布时间】:2018-09-18 22:48:29
【问题描述】:

以下代码:

class Tools {
  static int roll(int min, int max) {
    // IMPLEMENTATION
  }

  static int roll(List<int> pair) {
    // IMPLEMENTATION
  }
}

在第二个roll 函数上呈现The name 'roll' is already defined 错误。

怎么会?既然函数的参数不同,难道不应该应用多态吗?

编辑。更正标题以更好地反映主题。

【问题讨论】:

    标签: dart overloading


    【解决方案1】:

    您的代码演示的是函数重载,与多态无关。

    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');
    

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

    多态和静态方法:

    静态方法只能在没有类名作为前缀的情况下从定义它们的类内部访问。从子类调用时,需要使用超类的名称作为前缀。

    【讨论】:

    • Dart 不支持函数重载,那方法重载呢?
    • 在这方面功能和方法是一样的。关注github.com/dart-lang/sdk/issues/26488
    • 猜测是因为 JavaScript 不支持函数重载,并且 Dart 必须能够转编译为 JavaScript。现在我想了想,他们可以通过为每个签名添加不同的后缀来解决这个问题......无论如何,只要大声思考。
    • 最初是因为类型在 Dart 1.x 中是可选的,这会使这个特性难以实现,我认为 Dart 团队不认为它是值得在 Dart 2 中添加的特性,或者只是优先级是不够高。
    • 最初是因为类型在 Dart 1.x 中是可选的,这会使这个特性难以实现,我认为 Dart 团队不认为它是值得在 Dart 2 中添加的特性,或者只是优先级是不够高。
    【解决方案2】:

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

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

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

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

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

    不管怎样,这只是实现函数重载的另一种方式,不同情况还有很多方式。

    【讨论】:

      【解决方案3】:

      Dart 中没有函数重载。改用命名构造函数:

      ClassName.my_constructor1(int a,intb){
         
      }
      
      ClassName.my_constructor2(int a){
      
      }
       
      

      .你只能使用一个复制构造函数

      【讨论】:

        猜你喜欢
        • 2022-08-18
        • 2016-12-24
        • 2023-03-22
        • 1970-01-01
        • 2019-07-31
        • 1970-01-01
        • 2020-05-09
        • 1970-01-01
        • 2014-06-18
        相关资源
        最近更新 更多