命名继承的构造函数不在dart中接受参数

时间:2019-06-18 01:03:34

标签: inheritance dart super

我正在尝试使用命名构造函数继承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"; 
  } 

1 个答案:

答案 0 :(得分:0)

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

您不能在构造函数初始值设定项列表中引用this,这是错误试图告诉您的内容……只是不是很成功,因为它不能告诉您您在做什么,只能告诉您什么您必须这样做。

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

与构造函数恰好被命名的问题无关。对于未命名的构造函数,也会发生相同的问题。