【问题标题】:Named inherited constructor not taking arguments in dart命名的继承构造函数不接受 dart 中的参数
【发布时间】:2019-10-31 14:11:20
【问题描述】:

我正在尝试使用命名构造函数继承 dart 类,并且我想使用 super 和命名构造函数通过子类将数据传递到父类。

我尝试了很多变体,但这应该根据文档工作。我正在使用 Dart 2.0。注意:如果我有一个参数而不是命名构造函数,它可以工作。

class Person {

  String firstname;
  String lastname;
  String city;

//empty constructor
  Person();

//named constructors
  Person.setfirstlast(String firstname, String lastname);

//setters and getters ...
}

class Worker extends Person{

  String company;
  String title;
  double salary;
  String _memo;

  //empty constructor
  Worker(){
    _memo = "Great Worker";
  }

  //create named constructor  - WHY WILL SUPER.setfirstlast NOT WORK?

  Worker.setWorkerInfo( this.company, this.title, this.salary) :
     super.setfirstlast(firstname, lastname)
  {
      _memo = "Great Worker"; 
  } 
  //setters and getters ...
}

这是错误信息。

字符串名字

中只能访问静态成员
initializers.dart(implicit_this_reference_in_initializer)

字符串姓氏

中只能访问静态成员
initializers.dart(implicit_this_reference_in_initializer)

提前致谢!


** 答案**

对于那些感兴趣的人,我找到了解决方案,这就是您编写代码的方式。 Dart 有声明构造函数而不是继承,但也包括 super。

1 分钟的解释是,您实际上是在子级中创建了一个新的构造函数,其中包括来自基类的字段。请注意,您对子字段使用“this”,并在实际构造函数中为继承的字段使用数据类型和占位符。在这种情况下,字符串 fn 和字符串 ln。占位符然后通过 super 带来。

  Worker.setWorkerInfo( this.company, this.title, this.salary, String fn, String ln) :
     super.setfirstlast(fn, ln)
  {
      _memo = "Great Worker"; 
  } 

【问题讨论】:

  • Worker.setWorkerInfo 从哪里得到firstnamelastname

标签: inheritance dart super


【解决方案1】:

super.setfirstlast(firstname, lastname) 引用 firstnamelastname。这些是Worker.setWorkerInfo 构造函数的参数,并且它们没有在周围的词法范围内声明,因此它们隐式引用this.firstnamethis.lastname

你不能在构造函数初始化列表中引用this,这是错误试图告诉你的......不是很成功,因为它没有告诉你你在做什么,只有你必须做什么改为。

您可能希望将String firstname, String lastname 作为参数添加到Worker.setWorkerInfo 构造函数。

与构造函数恰好被命名的问题无关。未命名的构造函数也会出现同样的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2021-11-03
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多