【问题标题】:Best way to initialize super constructor with fix parameters in Dart?在 Dart 中使用固定参数初始化超级构造函数的最佳方法?
【发布时间】:2021-04-17 14:18:50
【问题描述】:

我想在我的飞镖中初始化超级构造函数。我想要的代码是这样的:

class ChildClass extends ParentClass{
     ChildClass(){
         var startNumber = 4;
         var endNumber  = 8;
         super(startNumber, endNumber);
     }
}

但是,它在 dart 代码中不起作用。

备选方案 1:

class ChildClass extends ParentClass{
     ChildClass() : super(4,8);
}

备选方案 1 的问题在于它不是干净的代码。 4和8是什么?

备选方案 2:

class ChildClass extends ParentClass{
     int sNumber = 4;
     int eNumber = 8;

     ChildClass() : super(sNumber, eNumber);
}

备选方案 2 的问题在于字段 sNumbereNumber 是多余的,因为如果该字段是公共的,我们可以使用来自 ParentClassstartNumberendNumber

备选方案 3:

class ChildClass extends ParentClass{
     ChildClass({Int startNumber = 4, int endNumber = 8}) : super(startNumber, endNumber);
}

替代方案 3 的问题是我们可以更改参数 startNumberendNumber 的值

如何在明确传递值的含义的同时调用超级构造函数?

【问题讨论】:

  • 请不要使用明确表示“请勿使用”的标签。

标签: dart constructor super


【解决方案1】:

最终你的问题来自于想让ParentClass的构造函数参数更清晰。因此,理想情况下,您应该让ParentClass 的构造函数采用命名参数:

class ParentClass {
  int startNumber;
  int endNumber;

  ParentClass({required this.startNumber, required this.endNumber});
}

class ChildClass {
  ChildClass() : super(startNumber: 4, endNumber: 8);
}

如果您无法控制ParentClass,那么另一种选择是在ChildClass 中使用带有私有构造函数的命名参数:

class ChildClass {
  ChildClass() : this._internal(startNumber: 4, endNumber: 8);

  ChildClass._internal({required int startNumber, required int endNumber})
    : super(startNumber, endNumber);
}

【讨论】:

  • 好主意。所以我们可以使用私有构造函数
【解决方案2】:

使用备选方案 2 并将字段设为私有和 const

class ChildClass extends ParentClass{
     static const int _sNumber = 4;
     static const int _eNumber = 8;

     ChildClass() : super(_sNumber, _eNumber);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2022-11-23
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多