Именованный унаследованный конструктор, не принимающий аргументы в дротике - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь унаследовать класс 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 ...
}

Вот сообщение об ошибке.

String firstname В

* 1009 могут быть доступны только статические члены*

Строка фамилия Доступ к статическим членам возможен только в

initializers.dart(implicit_this_reference_in_initializer)

Заранее спасибо!


** Ответ **

Для тех, кто заинтересованЯ нашел решение, и вот как вы его кодируете.Дарт утверждает, что конструкторы не наследуются, но также включают в себя супер.

1-минутное объяснение состоит в том, что вы по сути создаете в конструкторе новый конструктор, который включает в себя поля из базового класса.Обратите внимание, что вы используете «this» для дочерних полей и используете тип данных и заполнители для унаследованных полей в фактическом конструкторе.В этом случае String fn и String ln.Затем заполнители переносятся через супер.

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

1 Ответ

0 голосов
/ 18 июня 2019

super.setfirstlast(firstname, lastname) ссылки firstname и lastname. Это не параметры для конструктора Worker.setWorkerInfo, и они не объявляются в окружающей лексической области, поэтому они неявно ссылаются на this.firstname и this.lastname.

Вы не можете сослаться на this в списке инициализатора конструктора, о чем пытается сказать ошибка ... просто не очень успешно, поскольку он не говорит вам, что вы делаете, только то, что вы должны делай вместо этого.

Скорее всего, вы хотите добавить String firstname, String lastname в качестве параметров к конструктору Worker.setWorkerInfo.

Это не имеет отношения к проблеме, что конструктор случайно назван. Та же проблема возникнет для безымянного конструктора.

...